【问题标题】:Remove "d1p1" namespace prefix in DataContractSerializer XML output删除 DataContractSerializer XML 输出中的“d1p1”命名空间前缀
【发布时间】:2012-03-12 15:33:58
【问题描述】:

我正在使用DatacontractSerializer 将我的 domainModel 序列化为一个 xml 文件。 我得到如下输出。

<z:anyType xmlns:i="http://www.w3.org/2001/XMLSchema-instance" z:Id="1" xmlns:d1p1="DCSerialization_IGITApproach" i:type="d1p1:X" xmlns:z="http://schemas.microsoft.com/2003/10/Serialization/">
  <d1p1:Name z:Id="2">Ankit</d1p1:Name>
  <d1p1:PointsDictionary xmlns:d2p1="http://schemas.microsoft.com/2003/10/Serialization/Arrays" z:Id="3" z:Size="1">
    <d2p1:KeyValueOfstringPointsArrayq9VX7VJJ>
      <d2p1:Key z:Id="4">key1</d2p1:Key>
      <d2p1:Value xmlns:d4p1="http://schemas.datacontract.org/2004/07/SerializationApproach" z:Id="5">
        <d4p1:points z:Id="6" z:Size="2">
          <d2p1:double>45.5</d2p1:double>
          <d2p1:double>546.45</d2p1:double>
        </d4p1:points>
      </d2p1:Value>
    </d2p1:KeyValueOfstringPointsArrayq9VX7VJJ>
  </d1p1:PointsDictionary>
</z:anyType>

我想摆脱这些“d1p1”命名空间前缀,只想要&lt;/PointDictionary&gt; 类似标签而不是&lt;/d1p1:PointsDictionary&gt;。 我已经尝试将 DataMember 属性放在我的类属性上,但它并没有解决很多问题。 由于最终用户可以编辑输出 XML 文件,因此与上述文件相比,我想要一个看起来更清晰的 XML 文件。

首要任务是仅通过代码控制它,如果不可能,则使用 XSLT 或任何其他模式。

【问题讨论】:

  • 欢迎使用 StackOverflow:如果您发布代码、XML 或数据示例,在文本编辑器中突出显示这些行并单击“代码示例”按钮 ({ } ) 在编辑器工具栏上很好地格式化和语法突出显示它!

标签: serialization namespaces xml-serialization prefix wcf-serialization


【解决方案1】:

您应该能够摆脱这些前缀,只需确保您尝试序列化为 XML 的类在同一个命名空间内。例如,我有两个类 ApplicationListResponse 和 Application。以前的命名空间是 Models.Responses 和 Models.Responses.Application。我将两个命名空间都更改为“模型”,并且去掉了 XML 输出中的前缀。

【讨论】:

    【解决方案2】:

    使用空命名空间似乎会删除前缀。使用以下 DataContract 属性设置您的类:

    [DataContract(Namespace="")]
    public class MyClass
    { ... }
    

    那么在(反)序列化的时候一定要设置命名空间为空字符串:

    DataContractSerializer deserializer = new DataContractSerializer(typeof(MyClass), typeof(MyClass).Name, "");
    

    【讨论】:

      【解决方案3】:

      看起来DataContractSerializer 对前缀没有太多控制。如果您想控制命名空间前缀,XML Serialization and namespace prefixes 的答案建议使用XmlSerializer

      您的问题不清楚是否要完全删除域模型的命名空间前缀。上面的示例有几个命名空间前缀:d1p1、d2p1、d4p1。 Changing namespace for XML file in XSL Translation 提供了一些关于使用 XSLT 重命名前缀的指导。

      【讨论】:

      • XmlSerializer 与 DataContractSerializer 相比有两个限制:它不会处理接口,并且它强制每个类都有一个无参数的构造函数。我相信使用 DataContractSerializer 并找到其他处理命名空间问题的方法是一个更好的长期解决方案。
      • @Contango,我原则上同意......除了DataContractSerializer 确实(根据我的经验)需要一个无参数的构造函数。如果我尝试在没有的类型上实例化它,我会收到运行时错误。
      • @harpo DataContractSerializer 绝对不需要空的构造函数。你做错了什么。如果您想在新问题中发布您的代码,我很乐意对其进行审核。
      • @Dan,我相信你是对的,我会纠正的。对于有问题的项目,我最终选择了XmlSerializer,交易(至少是潜在的)不变性以更好地控制序列化。
      • @harpo 我仍然很好奇您是如何尝试使用 DataContractSerializer 的,特别是如果您认为 XmlSerializer 提供了更好的控制。事实上,这正是我自己开始远离 XmlSerializer 的原因。通过将 DataContractSerializer 与 XmlWriter 结合使用,您可以获得 XML 的许多优点而不受 XmlSerializer 的限制。也许,当您有空闲时间时,您可能有兴趣研究这种方法。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-05-11
      • 2011-03-04
      相关资源
      最近更新 更多