c#XML序列化:命名空间声明的顺序

c#XML序列化:命名空间声明的顺序,第1张

概述我有一个非常奇怪的情况.我像这样序列化我的命名空间: var namespaces = new XmlSerializerNamespaces();namespaces.Add("xsd", "http://www.w3.org/2001/XMLSchema");namespaces.Add("xsi", "http://www.w3.org/2001/XMLSchema-instance") 我有一个非常奇怪的情况.我像这样序列化我的命名空间:
var namespaces = new XmlSerializernamespaces();namespaces.Add("xsd","http://www.w3.org/2001/XMLSchema");namespaces.Add("xsi","http://www.w3.org/2001/XMLSchema-instance");serializer.Serialize(writer,config,namespaces);

在我的机器上,我得到以下xml(一行我刚刚添加了换行符):

<SystemConfiguration       xmlns:xsd="http://www.w3.org/2001/XMLSchema"       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"       xmlns="http://www.schaeffler.com/Sara/systemconfiguration/">

在构建服务器上,我使用相同的软件:

<SystemConfiguration       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"       xmlns:xsd="http://www.w3.org/2001/XMLSchema"       xmlns="http://www.schaeffler.com/Sara/systemconfiguration/">

你看到xsd和xsi的顺序是交换的.我检查了序列化程序的实现,发现顺序是用散列表确定的,并且XmlSerializernamespaces没有接口来为命名空间实现我自己的序列化程序.

这是XmlSerializationWriter中的方法:

protected voID WritenamespaceDeclarations(XmlSerializernamespaces xmlns)    {      if (xmlns != null)      {        foreach (DictionaryEntry dictionaryEntry in xmlns.namespaces)        {          string localname = (string) dictionaryEntry.Key;          string ns = (string) dictionaryEntry.Value;          if (this.namespaces != null)          {            string str = this.namespaces.namespaces[(object) localname] as string;            if (str != null && str != ns)              throw new InvalIDOperationException(Res.GetString("XmlDuplicateNs",(object) localname,(object) ns));          }          string str1 = ns == null || ns.Length == 0 ? (string) null : this.Writer.LookupPrefix(ns);          if (str1 == null || str1 != localname)            this.WriteAttribute("xmlns",localname,(string) null,ns);        }      }      this.namespaces = (XmlSerializernamespaces) null;    }

什么可以导致hashmap中命名空间的不同顺序?

解决方法 来自msdn:

The elements are sorted according to the hash value of the key,and
each key can exist only once in the collection.

DictionaryEntry(结构)的哈希值是从ValueType.GetHashCode()中提取的.它可能返回一个不可确定的密钥 – 可能基于潜在的参考值.您需要进行一些进一步的反思,以确定如何计算哈希值.它可能只是使用默认对象实现.

也来自msdn:

A hash code is intended for efficIEnt insertion and lookup in collections that are based on a hash table. A hash code is not a permanent value.

总结

以上是内存溢出为你收集整理的c#XML序列化:命名空间声明的顺序全部内容,希望文章能够帮你解决c#XML序列化:命名空间声明的顺序所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/1239253.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-06
下一篇 2022-06-06

发表评论

登录后才能评论

评论列表(0条)

保存