如果实现对象不是Serializable,我如何序列化基础对象?

时间:2012-07-25 16:04:32

标签: c# .net 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());
        }
    }

UsersVM定义为

public class UsersVm : ViewModelBase {}

ViewModelBase定义为

[Serializable]
public class ViewModelBase {}

这给了我以下错误:

  

类型'UsersVM'未标记为可序列化。

为什么告诉我这个,如果我将对象userVm强制转换为ViewModelBase 标记为Serializable)将其传递给{{1} }?

我原以为传递Serialize(ViewModelBase instance)在将UsersVM传递给带ViewModelBase的方法时会被基类型ViewModelBase替换。

如何序列化ViewModelBase?

1 个答案:

答案 0 :(得分:5)

解决问题

您必须将派生类标记为可序列化

[Serializable]
public class UsersVm : ViewModelBase {}

为什么必须这样做

BinaryFormatter在序列化时查看对象实例的实际类型。演员只是告诉编译器将实例视为它是一个不同的类型,但实际上并没有将实例更改为该类型。

旁注

我最初向后看了这个问题,发现反问题的答案很有意思并且可能对其他人有用......

请注意,如果情况发生逆转(基类未标记为可序列化且您无法访问源代码),您仍然可以实现目标。

  

子类可以实现ISerializable,使用反射来读取和序列化基类的字段,并在反序列化期间再次使用反射来设置这些字段

http://msdn.microsoft.com/en-us/magazine/cc163902.aspx#S14

本文提供了一个代码示例,其中包含一个帮助实现此方法的实用程序。