我正在尝试将一个对象序列化为具有多个属性的 XML,其中一些属性是只读的。
public Guid Id { get; private set; }
我已经将类标记为 [Serializable] 并且我已经实现了 ISerializable 接口(interface)。
下面是我用来序列化我的对象的代码。
public void SaveMyObject(MyObject obj)
{
XmlSerializer serializer = new XmlSerializer(typeof(MyObject));
TextWriter tw = new StreamWriter(_location);
serializer.Serialize(tw, obj);
tw.Close();
}
不幸的是,它落在了这条消息的第一行。
InvalidOperationException was unhandled: Unable to generate a temporary class (result=1). error CS0200: Property or indexer 'MyObject.Id' cannot be assigned to -- it is read only
如果我将 Id 属性设置为 public,它就可以正常工作。有人可以告诉我我是否正在做某事,或者至少如果可能的话?
最佳答案
您可以使用 DataContractSerializer
(但请注意您不能使用 xml 属性 - 只能使用 xml 元素):
using System;
using System.Runtime.Serialization;
using System.Xml;
[DataContract]
class MyObject {
public MyObject(Guid id) { this.id = id; }
[DataMember(Name="Id")]
private Guid id;
public Guid Id { get {return id;}}
}
static class Program {
static void Main() {
var ser = new DataContractSerializer(typeof(MyObject));
var obj = new MyObject(Guid.NewGuid());
using(XmlWriter xw = XmlWriter.Create(Console.Out)) {
ser.WriteObject(xw, obj);
}
}
}
或者,您可以实现 IXmlSerializable
并自己完成所有操作 - 但这至少适用于 XmlSerializer
。
关于c# - 序列化私有(private)成员数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/802711/