为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

C#
一只萌萌小番薯 2022-07-10 16:00:41
我通常将我的结构设为只读。然而,序列化库(例如DataContractSerializer)期望序列化的字段或属性是读/写的。所以我相信我的选择是:让我的字段可写只是为了安抚序列化程序为序列化目的创建代理对象使用反射自动生成代理通过尝试使用启发式或属性猜测适当的构造函数来自动生成序列化/反序列化函数。在这种情况下,人们通常会怎么做?
查看完整描述

1 回答

?
心有法竹

TA贡献1866条经验 获得超5个赞

如果您像这样初始化 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;

}

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


查看完整回答
反对 回复 2022-07-10
  • 1 回答
  • 0 关注
  • 109 浏览

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号