Dav*_*Dev 4 .net c# serialization
我试图序列化如下类型:
public UsersPanel(UsersVM userVm)
{
var serialized = Serialize(userVm);
}
public static string Serialize(ViewModelBase instance)
{
var formatter = new BinaryFormatter();
using (var stream = new MemoryStream())
{
formatter.Serialize(stream, instance); // breaks here
return Convert.ToBase64String(stream.ToArray());
}
}
Run Code Online (Sandbox Code Playgroud)
在哪里UsersVM
定义为
public class UsersVm : ViewModelBase {}
Run Code Online (Sandbox Code Playgroud)
并被ViewModelBase
定义为
[Serializable]
public class ViewModelBase {}
Run Code Online (Sandbox Code Playgroud)
这给了我以下错误:
类型'UsersVM'未标记为可序列化.
为什么它告诉我这个,如果我通过将对象userVm
传递给ViewModelBase
(通过传递它来将对象转换为(可标记为Serializable)Serialize(ViewModelBase instance)
?
我原以为传递UsersVM
会ViewModelBase
在将它传递给需要的方法时被基类型替换ViewModelBase
.
如何序列化ViewModelBase?
解决问题
您必须将派生类标记为可序列化
[Serializable]
public class UsersVm : ViewModelBase {}
Run Code Online (Sandbox Code Playgroud)
为什么你必须这样做
BinaryFormatter 在序列化时查看对象实例的实际类型.强制转换只是告诉编译器将实例视为不同类型,但实际上并未将实例更改为该类型.
边注
我最初向后看了这个问题,发现反问题的答案很有意思并且可能对其他人有用......
请注意,如果情况发生逆转(基类未标记为可序列化且您无法访问源代码),您仍然可以实现目标.
子类可以实现ISerializable,使用反射来读取和序列化基类的字段,并在反序列化期间再次使用反射来设置这些字段
http://msdn.microsoft.com/en-us/magazine/cc163902.aspx#S14
本文提供了一个代码示例,其中包含一个帮助实现此方法的实用程序
归档时间: |
|
查看次数: |
1372 次 |
最近记录: |