gpt4 book ai didi

c# - C#中涉及引用时的序列化与反序列化

转载 作者:行者123 更新时间:2023-11-30 15:43:47 25 4
gpt4 key购买 nike

我有一个名为 Manager 的单例类,它包含一个对象实例列表:

static class Manager
{
static List<Foo> Foos = new List<Foo>();
}

然后我有一个对象实例集合,使用一个名为 Meter 的类,该类使用对列表 Foos 中项目的引用:

class Meter
{
public Foo MyFoo = null;
}

...

public void CreateMeter(int UserChoice)
{
Meter MyMeter = new Meter();
MyMeter.MyFoo = Manager.Foos[UserChoice];
}

当应用程序保存项目文件时,它会序列化 Foos 中的 Foo 实例以及 Meter 的所有实例。

我的问题是如何反序列化这种安排。目前,我执行以下操作:

  • 反序列化 Foo 的项目范围实例以重建 Manager.Foos
  • 反序列化一个 meter 实例,其中包含 MyFoo 属性的 Foo 实例
  • 搜索 Manager.Foos 并找到 MyMeter.MyFoo 的匹配引用,然后从 Manager.Foos 分配引用。

在我看来这很笨重而且不太容易扩展。我宁愿 Meter 工厂不需要在反序列化期间搜索 Manager.Foos,因为将来 Meter 可能会从其他地方引用 Foo 实例,而不仅仅是 Manager。

对于这个反序列化问题,是否有一个简单而灵活的替代解决方案,可以轻松地重建对对象的引用?

最佳答案

序列化很难:)

以不混淆格式的方式自动执行此操作很麻烦。这里的一个常见技巧是在反/序列化时使用中央映射分配一个不相关的不透明键。通过在构造函数中启用引用跟踪,您可以在 DataContractSerializer 中看到这一点。然后使用此 key 来检查现有对象作为替代。

就我个人而言,当 IMO 变得如此复杂时,就该使用预装的气化器了;即使在专门的图书馆内,这也有点挑战。我使用的方法 (protobuf-net) 非常相似,但更难阅读(二进制密集输出等)。

关于c# - C#中涉及引用时的序列化与反序列化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6547160/

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