- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
准备好你们的火把吧!互联网上有人暗示 .NET 框架存在错误! :-)
考虑这个人为的模型:
public class Barn
{
public Horse Horse { get; set; }
public Motorcycle Motorcycle { get; set; }
}
public class Horse
{
public Horse()
{
Rider = "Jim Craig";
}
[XmlElement(IsNullable = true, Namespace = "abc")]
public string Rider { get; set; }
}
public class Motorcycle
{
public Motorcycle()
{
Rider = "Ghost";
}
[XmlElement(IsNullable = false, Namespace = "abc")]
public string Rider { get; set; }
}
请注意,两个 Rider
属性共享相同的名称和命名空间,但在其他方面不相关。一个是 XML 可为空的,另一个则不是。
下面是一些用于 XML 序列化然后反序列化空骑马者的代码:
// Create a Barn, with a Horse, with a null Rider
Barn barnBefore = new Barn();
barnBefore.Horse = new Horse();
barnBefore.Horse.Rider = null;
// Serialize and then deserialize the Barn
XmlSerializer serializer = new XmlSerializer(typeof(Barn));
MemoryStream stream = new MemoryStream();
serializer.Serialize(stream, barnBefore);
stream.Seek(0, SeekOrigin.Begin);
Barn barnAfter = (Barn)serializer.Deserialize(stream);
// Is the Horse's Rider still null?
Console.WriteLine(barnAfter.Horse.Rider == null ? "null" : "not null");
Horse
的 Rider
属性具有 IsNullable = true
,因此应通过序列化维护其 null 值。运行上面的代码,输出确实是null。到目前为止一切顺利。
现在,有趣的部分是:交换 Barn
类中 Horse
和 Motorcycle
属性的顺序,以便 摩托车
是第一位的。
再次运行它,现在输出是not null。到底是什么?!
我已经在 VS 2008 和 2010 上进行了测试。
为了获得更多乐趣,请尝试将两个 Rider
属性设置为不同类型,例如一个为 string
,另一个为 int
。这确实搞砸了XmlSerializer
。
我对如何解决此问题不感兴趣。那是微不足道的。我的问题是:这是一个错误,还是我误解了什么?
最佳答案
嗯,在第一种情况下,编写的 XML 看起来有点像这样:
<Barn>
<Horse>
<Rider xsi:nil="true" xmlns="abc" />
</Horse>
</Barn>
但是在第二种情况下,XML 如下所示:
<Barn>
<Horse />
</Barn>
因此,在第二种情况下,反序列化过程中发生的事情基本上是这样的:
Barn barn = new Barn();
barn.Hose = new Horse();
因此,因为我们在构造函数中默认设置 Rider,所以它保留为“Jim Craig”。
有趣的是,只需更改 Barn
中元素的顺序即可反转该行为。为了尝试发现更多信息,我们可以使用 ILSpy 进行一些挖掘。和 Sgen.exe - 只需针对我们的程序集运行 sgen 并查看生成的程序集。
我们发现,在第一种情况下,Write2_Horse
和 Write3_Motorcycle
方法both中生成的代码有一行如下所示:
base.WriteNullableStringLiteral("Rider", "abc", o.Rider);
但是在第二种情况下,它看起来像这样:
base.WriteElementString("Rider", "abc", o.Rider);
我看不出为什么像这样改变元素的顺序会改变 Horse
和 Motorcycle
元素的序列化行为,简而言之,在我看来,这就像 XML 序列化程序集生成器中的一个错误。
您应该向 Microsoft 报告此问题:-)
关于当两个类具有相同名称的属性时,.NET XmlSerializer 错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5658624/
在我的 Visual Studio 2010 项目中,我使用以下 Post-Build 事件命令行使用 sgen 创建 XmlSerializers.dll。 构建后事件: "$(ProgramFil
我用 XMLSerializer 类做了一些事情。像大多数初学者一样,我在应用程序启动时遇到性能问题。我阅读了很多博客、文章,最后使用了 SGEN 工具。现在性能看起来还不错,但我还有一些不清楚的地方
过去 2 天我一直被这个问题困扰,但仍然没有解决,我正在寻求帮助。 我的 Listbox根据在 Combobox 中选择的项目,获取添加到其中的生成项目.当我点击按钮时 Create出现一个带有 We
我正在尝试解决如何生成一些 Xml,它使用 XmlSerializer 的一组类中的前缀不仅仅是微不足道的使用。我还希望能够读取相同的 Xml(这相当简单,但随着我使用更复杂的属性似乎消失了。 具体用
XmlSerializer 很难(= 不)反序列化包含表情符号字符的内容,例如 ��。我读过这样的字符在 XML 标准中实际上是非法的;但是,如果我想忠实地表示包含表情符号的聊天对话,则需要它们。如何
我将 XmlSerializer 用于 WCF 服务(就我的服务而言,这是有原因的)。但是最近我遇到了这个问题:我找不到一种简单的方法来使引用类型属性成为必需的,即使其在 XSD 中的定义如下所示:
假设您有两个类,一个继承另一个类,并且子类需要使用 XmlSerializer 进行序列化/反序列化。但是,父级包含一个不可序列化的成员,例如字典。 public class Parent {
我正在尝试使用 XmlSerializer 解析具有如下所示元素的 XML。 amount 元素下有相当多的货币类型,我想将它们反序列化为一个对象集合,这些对象具有保存货币类型的字符串属性和保存金额的
我正在用 Javascript 生成 KML 文档,并尝试使用 XMLSerializer生成 XML 文件,但它生成所有小写标签,即使我在 DOM 中以大写形式创建标签。 是 DOM 破坏了大小写还
我有一小段代码可以将 XML 解析为 JSON。它工作得很好,直到我引入 XMLSerializer 来获取 JSON。 public static String convertXMLFileToSt
假设您有两个类,一个继承另一个,子类需要使用 XmlSerializer 进行序列化/反序列化。但是,父级包含一个不可序列化的成员,比如字典。 public class Parent { pu
我正在尝试使用 XmlSerializer 解析具有如下所示元素的 XML。 amount 元素下有相当多的货币类型,我想将它们反序列化为一个对象集合,这些对象具有保存货币类型的字符串属性和保存金额的
我正在尝试将继承属性的所有成员序列化 (XmlSerializer) 作为特性。 两个类: public class Tree { public Point Location { get; s
我在使用 XmlSerializer 时遇到了修剪字符串的问题, 当使用 XmlReader 时。 IgnoreWhitespace 选项显示无效,元素字符串仍包含\n 和空格。 有什么方法可以“即时
我有以下扩展方法来序列化我的类.... public static string SerializeToXml(this object obj) {
我正在尝试反序列化以下 XML(摘录): Waking The Demon Bullet For My Valentine false B
我在使用 .NET 中的 XmlSerializer 时遇到了一些问题。 这里我有一个我刚刚建立的小例子。 (也可用 @ gist https://gist.github.com/2d84be9041
我从 DTD(通过 XSD 和 xsd.exe)为我的 C# 项目创建了类,因此我可以轻松地将它们反序列化为代码中的模型类。 我大致是这样的: XmlReaderSettings readerSett
我使用 XSD.EXE 将 XSD 转换为对象。这很好用,我可以很好地使用 XMLSerializer 反序列化,除了作为数组生成的子元素不会填充。 private SubElements[]
对不起我的英语。我有 XmlSerializer 的奇怪之处。这是我的代码 [Serializable] public class Radio { public bool hasSubWoof
我是一名优秀的程序员,十分优秀!