我有一段看起来像这样的代码:
public static class MyStaticClass
{
public static readonly MyObject1 object1 = new MyObject1();
}
[Serializable]
public class MyOtherClass
{
public MyObject1 Obj { get; } = MyStaticClass.object1;
}
当反序列化(使用默认二进制序列化)MyOtherClass的实例时,Obj不再是与MyStaticClass.object1相同的对象。有没有办法自动保留该引用,或者我只是需要通过字符串或其他标识符重建它?如果是这样,那么干净地重建该引用的推荐方法是什么?
答案 0 :(得分:0)
有没有办法自动保留该引用
这取决于你自动"的定义,但假设你的意思是"没有写任何额外的代码",答案是" no"。
序列化处理数据,而不是对象。反序列化对象时,库存反序列化实现知道的所有内容都是存储的数据。这是应该的;通用反序列化实现甚至不知道在哪里寻找匹配这样的对象并使用现有引用,因此它必须从所有根搜索整个内存中对象图。
您需要提供一种明确处理此问题的机制。根据您使用的序列化方法,您可以自定义整个过程,这样您就不必序列化整个MyObject1
数据,而只是存储某种标记,您的自定义反序列化可用于表示原始对象。
或者,您的自定义可以依赖于MyObject1
实现某种类型的相等性,以便您可以比较反序列化的对象并将其引用替换为" stock"如果两个对象相等,则引用。
如果您正在使用支持IObjectReference.GetRealObject()
提到的in the comments的序列化方法,那也可以。
但无论你做什么,你都必须自己做。 (或者使用支持开箱即用功能的第三方库...我不知道,但这并不意味着它不存在。)