序列化对静态只读成员的引用

本文关键字:引用 成员 只读 静态 序列化 | 更新日期: 2023-09-27 18:09:16

我有一段代码,看起来像这样:

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相同的对象。是否有任何方法可以自动保留该引用,或者我将不得不通过字符串或其他标识符来重建它?如果是这样,建议使用什么方法干净地重新构建该引用?

序列化对静态只读成员的引用

有没有办法自动保留那个引用

这取决于你对"自动"的定义,但假设你的意思是"不编写任何额外的代码",答案是"否"。

序列化处理数据,而不是对象。在对对象进行反序列化时,股票反序列化实现所知道的只是存储的数据。这是应该的;通用的反序列化实现甚至不知道在哪里查找这样的对象并使用现有的引用,因此它必须从所有根中搜索整个内存中的对象图。

您需要提供一种机制来显式地处理此问题。根据您使用的序列化方法,您可以自定义整个过程,这样您就不必序列化整个MyObject1数据,而只需存储某种标记,您的自定义反序列化可以使用它来表示原始对象。

或者,您的定制可以仅仅依赖于MyObject1实现某种类型的相等,这样您就可以比较反序列化的对象,并在两个对象相等时将其引用替换为"stock"引用。

如果你正在使用支持评论中提到的IObjectReference.GetRealObject()的序列化方法,那也可以工作。

但是无论你做什么,你都必须自己做。(或者使用第三方库来支持类似开箱即用的功能& help;我不知道有,但这并不意味着它不存在。)