序列化私人成员数据

我正在尝试将对象序列化为具有许多属性的XML,其中一些属性为只读。


public Guid Id { get; private set; }

我已经标记了[Serializable]类,并且实现了ISerializable接口。


下面是我用来序列化对象的代码。


public void SaveMyObject(MyObject obj)

{

    XmlSerializer serializer = new XmlSerializer(typeof(MyObject));

    TextWriter tw = new StreamWriter(_location);

    serializer.Serialize(tw, obj);

    tw.Close();

}

不幸的是,它落在此消息的第一行。


未处理InvalidOperationException:无法生成临时类(结果= 1)。错误CS0200:无法将属性或索引器'MyObject.Id'分配给它-只读


如果我将Id属性设置为public,则效果很好。有人可以告诉我我是否正在做某事,或者至少可以做某件事?


慕雪6442864
浏览 365回答 3
3回答

繁星点点滴滴

您可以使用System.Runtime.Serialization.NetDataContractSerializer。它功能更强大,并修复了经典Xml Serializer的某些问题。请注意,此属性有不同的属性。[DataContract]public class X{  [DataMember]  public Guid Id { get; private set; }}NetDataContractSerializer serializer = new NetDataContractSerializer();TextWriter tw = new StreamWriter(_location);serializer.Serialize(tw, obj);编辑:根据Marc的评论进行更新:您可能应该System.Runtime.Serialization.DataContractSerializer在案例中使用以获得清晰的XML。其余代码相同。

SMILET

只读字段不会使用进行序列化XmlSerializer,这是由于readonly关键字的性质从MSDN:该只读关键字是修改,你可以在字段中使用。当字段声明包含只读修饰符时,对由该声明引入的字段的赋值只能作为声明的一部分或在同一类的构造函数中进行。所以...您几乎需要在默认构造函数中设置字段值...
打开App,查看更多内容
随时随地看视频慕课网APP