gpt4 book ai didi

c# - 如果实现对象不可序列化,我如何序列化基础对象?

转载 作者:太空狗 更新时间:2023-10-30 01:07:38 26 4
gpt4 key购买 nike

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

    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 {}

这给我以下错误:

Type 'UsersVM' is not marked as serializable.

如果我将对象 userVm 转换为 ViewModelBase( 标记为可序列化)它变成Serialize(ViewModelBase instance)?

我本以为传递 UsersVM 会在将其传递到采用 ViewModelBase 的方法时替换为基本类型 ViewModelBase

如何序列化 ViewModelBase?

最佳答案

解决问题

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

[Serializable]
public class UsersVm : ViewModelBase {}

为什么你必须这样做

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

旁注

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

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

the subclass can implement ISerializable, use reflection to read and serialize the base classes' fields, and use reflection again to set these fields during deserialization

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

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

关于c# - 如果实现对象不可序列化,我如何序列化基础对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11653941/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com