我正在try 将一个对象序列化为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:

如果我将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.

.net相关问答推荐

PowerShell中窗体定时器和系统定时器的统一处理

Powershell机器令牌组

为什么 ULong > 16 位的数学会变得不稳定?

xunit Assert.ThrowsAsync() 不能正常工作?

value 的默认参数必须是编译时间常数?

是否有任何 x 次的 for 循环的更短/更简单的版本?

.NET 应用程序的链接器状态(又名请先生,我可以有一个链接器2009 年版)

C# 的部分类是糟糕的设计吗?

找不到 Microsoft.Office.Interop Visual Studio

Winforms:Application.Exit vs Environment.Exit vs Form.Close

使用多个 MemoryCache 实例

编译错误:显式实现接口时修饰符 'public' 对此项目无效

无法在 Windows 10 上安装 Windows SDK 7.1

从 Windows 窗体打开 URL

.NET 的 String.Normalize 有什么作用?

何时使用抽象类?

当我们按下 Enter 键时启动的 WPF 文本框命令

在 .NET Core 中在 MVC 之外使用 Razor

使 HashSet 不区分大小写

判断任意字符串是否为有效文件名的最简单方法