序列化 C# 不可变结构的最佳做法是什么



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

所以我的选择我相信是:

  • 使我的字段可写只是为了安抚序列化程序
  • 创建用于序列化的代理对象
  • 使用反射自动生成代理
  • 通过尝试猜测自动生成序列化/反序列化函数使用启发式或属性的适当构造函数。

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

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;
}

通过使用私有资源库,您很难更改对象的状态(您可能可以使用反射来做到这一点)。因此,如果没有方法更改结构中的字段,并且所有属性都有私有资源库,则结构在技术上是不可变的。在你的情况下,我会选择私人二传手,它比玩反射更具可读性并且花费更少的精力。

相关内容

最新更新