4

我正在尝试序列化如下类型:

    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(标记为可序列化的)对象Serialize(ViewModelBase instance),它为什么告诉我这个?

我会认为在将其传递给方法时,传递UsersVM将被基类型取代。ViewModelBaseViewModelBase

如何序列化 ViewModelBase?

4

1 回答 1

5

解决问题

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

[Serializable]
public class UsersVm : ViewModelBase {}

为什么你必须这样做

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

边注

我最初倒读了这个问题,发现反问题的答案很有趣,并且可能对其他人有用......

请注意,如果情况相反(基类未标记为可序列化并且您无权访问源代码),您仍然可以实现您的目标。

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

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

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

于 2012-07-25T16:09:32.617 回答