我正在尝试序列化类似如下的类型:
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());
}
}
UsersVM
定义为
public class UsersVm : ViewModelBase {}
和ViewModelBase
定义为
[Serializable]
public class ViewModelBase {}
这给了我以下错误:
类型'UsersVM'未标记为可序列化。
为什么告诉我这个,如果我将对象userVm
强制转换为ViewModelBase
( 标记为Serializable)将其传递给{{1} }?
我原以为传递Serialize(ViewModelBase instance)
在将UsersVM
传递给带ViewModelBase
的方法时会被基类型ViewModelBase
替换。
如何序列化ViewModelBase?
答案 0 :(得分:5)
解决问题
您必须将派生类标记为可序列化
[Serializable]
public class UsersVm : ViewModelBase {}
为什么必须这样做
BinaryFormatter在序列化时查看对象实例的实际类型。演员只是告诉编译器将实例视为它是一个不同的类型,但实际上并没有将实例更改为该类型。
旁注
我最初向后看了这个问题,发现反问题的答案很有意思并且可能对其他人有用......
请注意,如果情况发生逆转(基类未标记为可序列化且您无法访问源代码),您仍然可以实现目标。
子类可以实现ISerializable,使用反射来读取和序列化基类的字段,并在反序列化期间再次使用反射来设置这些字段
http://msdn.microsoft.com/en-us/magazine/cc163902.aspx#S14
本文提供了一个代码示例,其中包含一个帮助实现此方法的实用程序。