序列化 C# 不可变结构的最佳实践是什么?

我通常将我的结构设为只读。然而,序列化库(例如DataContractSerializer)期望序列化的字段或属性是读/写的。

所以我相信我的选择是:

  • 让我的字段可写只是为了安抚序列化程序

  • 为序列化目的创建代理对象

  • 使用反射自动生成代理

  • 通过尝试使用启发式或属性猜测适当的构造函数来自动生成序列化/反序列化函数。

在这种情况下,人们通常会怎么做?


一只萌萌小番薯
浏览 110回答 1
1回答

心有法竹

如果您像这样初始化 DataContractSerializer 就能够序列化只读字段var serializer = new DataContractSerializer(       typeof(ToSerialize),       new DataContractSerializerSettings()        {           SerializeReadOnlyTypes =  true       });但是,如果您想反序列化具有只有 getter 的属性的类,这只会单向工作。所以你可以序列化,但不能反序列化这样的东西:[DataContract]public struct ToSerialize{  public ToSerialize(string a)  {    PropertyToSerialize = "a";  }  [DataMember]  public string PropertyToSerialize { get; }}因此,要么向您的属性添加一个私有集,要么添加一个支持字段并使用 [DataMember] 属性对其进行标记。[DataContract]public struct ToSerialize{  public ToSerialize(string a)  {    backingField = "a";  }  public string PropertyToSerialize => backingField;  [DataMember]  string backingField;}通过使用私有设置器,您很难更改对象的状态(您可能可以使用反射来完成)。因此,如果没有方法更改结构中的字段并且所有属性都有私有设置器,那么您的结构在技术上是不可变的。在你的情况下,我会选择一个私人二传手,它比玩反射更具可读性并且花费更少的精力。
打开App,查看更多内容
随时随地看视频慕课网APP