c# - 很难在 .NET 中可用的 XML 序列化选项之间做出选择

标签 c# xml serialization xmlserializer

直到昨晚,我一直在使用 .NET 中的各种库来解析 XML —— 主要是 XmlDocumentXDocument。我不知道为什么我没有早点研究这个问题,但我突然想到,.NET 中一定有一些可用的东西可以免费为您提供类序列化/反序列化,当然,它以 XmlSerializer 的形式出现类。

果然,通过使用几行代码,我能够轻松地序列化和反序列化(尽管在我当前编写的代码中,我只需要反序列化),并且没有更长的时间需要花费几个小时左右来编写我自己的类来与其他库一起执行此操作,再加上必要的单元测试。但问题是我希望我的属性是只读的。如果我将 setter 设为私有(private),那么在创建 XmlSerializer 时我会收到此错误:

无法生成临时类(结果=1)。 错误 CS0200:无法分配属性或索引器“MyProperty”——它是只读的

它看起来像 this is an issue that won't be resolved ,所以必须有一个解决方法。

果然,我找到了 this information ,这表明如果你放弃自动属性并返回私有(private)字段,你就可以编译代码。不幸的是,虽然它可以编译,但当您执行代码时,它实际上并没有反序列化数据。停止我的应用程序后,我注意到消息窗口中的几个条目说:

找不到元素“MyProperty”的架构信息。

这是因为没有代码为 MyProperty 赋值,因为 XmlSerializer 不知道如何处理私有(private)字段!!!

我在 StackOverflow 上找到了一个答案,其中显示了 another solution ,即使用我以前从未听说过的 DataContractSerializer 。我对我的类进行了必要的代码更改,但最终得到了与上面相同的消息。我运行了代码以确定,当 XML 反序列化时,类成员不会被设置。

我认为在我的特殊情况下,我要么忍住并允许成员被覆盖(不好),要么回到我原来的做事方式,即只编写所有序列化/自己的反序列化代码。我在这里做错了什么,或者是否不可能允许像 XmlSerializer 这样的类在反序列化期间设置类的私有(private)成员,同时使该类的使用者无法覆盖其成员?

更新:和yet another article显示了另一种方法来进行私有(private)属性的反序列化,但我刚刚尝试过,它也不起作用。

以下是我尝试反序列化的类的一些示例:

[Export]
[DataContract]
public class Configuration
{
    [DataMember(Name="Port")]
    private int _port;
    public int Port { get { return _port; }}
}

结果:使用 XmlSerializer 反序列化时,没有错误,但当我的 XML 文件的 Port 值为 1 时,_port 和 Port 的值为 0,例如<Port>1</Port>

另一个例子:

[Export]
public class Configuration
{
    public int Port { get; set; }
}

结果:反序列化正常,但我不需要公共(public) setter 。

我像这样反序列化该类:

XmlSerializer serializer = new XmlSerializer(typeof(Configuration));
FileStream reader = new FileStream( "config.xml", FileMode.Open);
Configuration Config = (Configuration)serializer.Deserialize( reader);
reader.Close();

最佳答案

我没有一个好的答案,但我有几个不好的答案。排名不分先后:

  1. 您可以创建具有读/写属性的纯数据传输对象,并将其用于序列化/反序列化。然后,您可以通过使用 DTO 进行构造来初始化不可变业务对象。

  2. 您提到的两个序列化器类还允许通过属性和代码的组合覆盖它们的行为。这可能足以解决您的问题,但工作量可能超过其值(value)。

关于c# - 很难在 .NET 中可用的 XML 序列化选项之间做出选择,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3430958/

相关文章:

c# - Microsoft.AspNetCore.Server.IIS.Core.IISHttpContextOfT 中间件 C# .NET Core 2.2

c# - PdfReader 未打开,iText 中出现所有者密码错误

c# - LINQ WhereClause 的问题

python - XML:从命名空间生成带有前缀的标签

xml - SOAP RPC/编码转换为 RPC/文字

即使为表单元素定义了 name 属性,JQuery form.serialize() 也会返回空字符串

c# - 使用 SqlDataAdapter 计算行数

java - 为什么 Jackson 多态序列化在列表中不起作用?

c# - ServiceStack,Action 可以返回 `IEnumerable<IWhateverInterface>` 吗?

xml - SOAP 响应的命名空间不适用于 XPath