c# - 序列化私有(private)成员数据

标签 c# .net xml serialization serializable

我正在尝试将一个对象序列化为具有多个属性的 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/

相关文章:

c# - 遍历数组

.net - 不同配置的 ClickOnce 部署

c# - 我将如何持续监听带有 GUI 的端口?

c# - String.Replace .NET Framework 的内存效率和性能

c# - 对象实例已被处置(EF)

c# - WPF 中的 Windows 窗体 Web 浏览器用户控件更新

c# - C# 中 Manual/AutoResetEvent 的轻量级替代品

c# - 根据 XSD 验证 XML 并忽略子元素的顺序

xml - SAPUI5 使用 XML 文件作为 "data-sap-ui-resourceroots"的 View ?

xml - XSLT 1.0 : IDOC to AdsML transformation