c# – 如果实现对象不是Serializable,我如何序列化基础对象?
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了c# – 如果实现对象不是Serializable,我如何序列化基础对象?,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含1423字,纯文字阅读大概需要3分钟。
内容图文
我试图序列化如下类型:
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(标记为Serializable),将其传递给Serialize(ViewModelBase实例)?
我原以为传递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# – 如果实现对象不是Serializable,我如何序列化基础对象?全部内容,希望文章能够帮你解决c# – 如果实现对象不是Serializable,我如何序列化基础对象?所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。