gpt4 book ai didi

c# - 重命名字段然后在 C# 中反序列化

转载 作者:太空狗 更新时间:2023-10-29 21:48:10 24 4
gpt4 key购买 nike

我将数据存储在已使用 .net BinaryFormatter 序列化的类实例中。我现在想重命名类中的一个字段,但仍然能够反序列化旧数据。

一个选项是实现 ISerializable 并手动反序列化该类的所有字段。但这似乎需要做很多工作,尤其是当我的类(class)有很多字段而我只重命名了一个字段时。

有没有更好的办法?


Craig 建议保留旧类的副本以进行反序列化,并将值复制到新类。我也在其他地方看到过这个建议 - 这比实现 ISerializable 有什么优势?据我所知,复制该类给我留下了 2 个几乎相同的类副本,而且我仍然必须将所有值从旧类复制到新类——这似乎与使用 ISerializable 实现 ISerializable 的工作量相同几乎是重复的类混合在一起。


有两个答案提到了Binders。我已经成功地使用 SerializationBinder 反序列化了一个被序列化为类 Foo 的类 Bar,但那是因为类的名称发生了变化。当您重命名字段时,SerializationBinder 是否也有帮助 - 比如当 int m_Left 已重命名为 int m_Right 时?

最佳答案

是的,这是基于字段的序列化程序的问题。您可以使用自定义 Binder 或“序列化代理”来避免实现 ISerializable,但这只是个案修复。

我已经讨论过这个主题(在混淆器和自动 Prop 的上下文中)here .我的建议是:不要使用 BinaryFormatter 来保持版本之间的数据...为此,请查看基于契约的序列化程序:

  • XmlSerializer
  • DataContractSerializer
  • 或者对于二进制,比如 protobuf-net

这些对您今天都没有帮助,但它可能会帮助您在未来围绕它进行设计。

关于c# - 重命名字段然后在 C# 中反序列化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/942343/

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