gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 21:20:08 25 4
gpt4 key购买 nike

直到昨晚,我一直在使用 .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 。我对我的类(class)进行了必要的代码更改,但最终得到的消息与上面相同。我运行代码以确保在反序列化 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com