【问题标题】:Is XML Serialization in .Net case sensitive?.Net 中的 XML 序列化是否区分大小写?
【发布时间】:2010-03-16 03:45:00
【问题描述】:

我没有找到任何明确说明 XML 序列化是否区分大小写的文档。

假设我有以下课程:

class Test
{
public int Field;
public string field;
}

当 XML 序列化这个类时我会有什么问题,因为它包含两个同名的字段,只是大小写不同?

澄清:我知道有两个同名的字段只是大小写不同是很糟糕的,我不是在设计这样的野兽。我正在与一个被另一个人放过我的野兽搏斗。

【问题讨论】:

  • 这里更大的问题是您有公共字段 - 更不用说 XML 序列化程序不喜欢的非公共类了。
  • 是的,VB.NET 程序也不会很喜欢你。任何必须维护该代码的人也不会。解决方案:重命名这些字段之一。
  • 查看已编辑帖子中的说明。
  • 那么,.Net 中的 XML 序列化是否区分大小写?
  • 相关:不要使用公共字段msdn.microsoft.com/en-us/library/ms229057.aspx 公共和受保护字段的版本不好,并且不受代码访问安全要求的保护。不要使用公开可见的字段,而是使用私有字段并通过属性公开它们。

标签: .net xml-serialization


【解决方案1】:

简短的回答是序列化保留大小写,并且类将在 C# 中成功序列化(假设您创建类 public - 照原样,XmlSerializer 会阻塞它)。

但如果你不得不问这个问题,那么课程设计就存在严重问题。拥有两个 public 属性或字段,名称相同,只是大小写不同,每个执行或影响不同的功能,这是一件可怕的事情。在这种情况下,字段甚至不是同一类型。

如果你下载了一个 3rd-party 库,它给你一个这样的课程,你会怎么做?你怎么知道哪个是哪个?你甚至会如何记录这一点,或者在文档中查找它?只是不要这样做——不要有两个成员,出于所有意图和目的,同名。唯一的例外是公共属性的私有支持字段 - 在这种情况下,两者密切相关,因此问题不大(尽管有些人仍然喜欢使用下划线作为前缀)。

正如 John 在评论中提到的,尽管 C# 区分大小写,但其他 .NET 语言不区分,因此您可能能够将其序列化为 XML,但不能保证其他人能够 将其反序列化到他们的环境中。

重新考虑你的设计,让它没有像这样的类。

【讨论】:

  • 我想我还应该指出,如果您遵循 Microsoft 的 C#/.NET 编码约定,那么无论如何属性都将使用 PascalCase,因此根本不应该出现这种情况;以小写字符开头的公共类成员违反约定。
  • 查看已编辑帖子中的说明。那么,.Net 中的 XML 序列化是否区分大小写?
  • logicnp:帖子的第一行说序列化程序保留了大小写,应该可以很好地与您的类一起使用。
  • @logicnp:术语“区分大小写”适用于读取解析的方式。如第一段所述,XML 序列化是在输出中保留 的情况,这意味着序列化 XML 中的情况将与 C# 中的情况相同,您最终将得到两个不同的 XML 元素,每个字段一个。尽管如此,即使您只是继承了这段代码并且没有编写它,我也会先修复该类,然后再尝试对它进行任何花哨的操作,例如序列化; Visual Studio 可以缩短工作时间,并在整个解决方案中自动重命名大约 5 秒。
猜你喜欢
  • 2011-11-16
  • 1970-01-01
  • 2015-08-24
  • 1970-01-01
  • 2016-04-06
  • 2014-01-19
  • 2010-10-29
相关资源
最近更新 更多