- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
直到昨晚,我一直在使用 .NET 中的各种库解析 XML——主要是 XmlDocument
和 XDocument
。我不确定为什么我不早点研究这个,但我突然想到 .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();
最佳答案
我没有一个好的答案,但我有几个不好的答案。排名不分先后:
您可以创建具有读写属性的纯数据传输对象,并将其用于序列化/反序列化。然后,您可以通过使用 DTO 构造来初始化不可变业务对象。
您提到的两个序列化程序类还允许通过属性和代码的组合来覆盖它们的行为。这可能足以解决您的问题,但可能会超出其值(value)。
关于c# - 很难在 .NET 中可用的 XML 序列化选项之间做出决定,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3430958/
关闭。此题需要details or clarity 。目前不接受答案。 想要改进这个问题吗?通过 editing this post 添加详细信息并澄清问题. 已关闭 9 年前。 Improve th
我有一个带有输入字段的表单,使用javascript,当用户输入超过2个字符时,它会在第一个输入字段下方创建相同的输入字段。其代码是: Optie 1: 1 && treated[this.na
这是我的: char userInput; int position; vector userVector(7); vector someVector(7,1); cin >> userInput;
尝试使用 typescript 和 redux 构建一个简单的 react crud 应用程序并遇到以下问题。我有一个具有指定签名的函数,它将一个人对象作为参数,如此处所示。 export defau
哦,我多么希望 TCP 像 UDP 一样基于数据包! [查看评论] 但是,唉,事实并非如此,所以我正在尝试实现我自己的数据包层。这是到目前为止的事件链(忽略写入数据包) 哦,我的数据包结构非常简单:两
我想在我的页面底部放置一个包含不同数量图片的栏,这些图片(如果比页面宽)可以左右滚动。 页面宽度在变化,我希望 Pane 的宽度为 100%。 我试图通过让中间的 div 溢出并使用 jquery.a
我曾尝试在工作时将我的 Rails 应用程序 bundle 到我的 Mac 上。在家里它运行良好,我之前已经设法自己解决了它,但这次无论我尝试什么似乎都无法解决它。 我在运行 bundle/bundl
所以我有一个旧的网络表单站点,并且正在努力使其更易于维护。把它扔掉并重写它不是一种选择。 IoC 显然是它首先得到的东西之一,但这给我留下了服务定位器模式和糟糕的品味,并且想知道它是否可以做得更好。
我是一名优秀的程序员,十分优秀!