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

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)

我原以为传递UsersVMViewModelBase在将它传递给需要的方法时被基类型替换ViewModelBase.

如何序列化ViewModelBase?

Eri*_* J. 5

解决问题

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

[Serializable]
public class UsersVm : ViewModelBase {}
Run Code Online (Sandbox Code Playgroud)

为什么你必须这样做

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

边注

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

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

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

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

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