WCF 序列化长命名空间被重复而不是前缀

Posted

技术标签:

【中文标题】WCF 序列化长命名空间被重复而不是前缀【英文标题】:WCF Serialization Long Namespace being repeated instead of prefix 【发布时间】:2014-05-07 11:03:38 【问题描述】:

我们在项目中对 WCF 服务使用契约优先方法,XSD 使用 WSCF Blue 转换为实体,并使用默认序列化。默认序列化程序按以下方式序列化数据包

<category xmlns="http://myportal.com/schema/category/v1.0">
          <processingDate xmlns="http://myportal.com/schema/common/elements/v1.0">0001-01-01T00:00:00</processingDate>
          <key **xmlns="http://myportal.com/schema/common/elements/v1.0"**>f9a8d542-72c8-4465-8d6b-aaeb94a72394</key>
          <code>C511746379</code>
          <name>category308277327</name>
          <description>One Tow</description>
</category>
<region xmlns="http://myportal.com/schema/shared/region/v1.0">
          <key **xmlns="http://myportal.com/schema/common/elements/v1.0"**>3</key>
          <code>N35</code>
          <name>North</name>
          <panelCode>N98</panelCode>
</region>
<category xmlns="http://myportal.com/schema/category/v1.0">
          <processingDate xmlns="http://myportal.com/schema/common/elements/v1.0">0001-01-01T00:00:00</processingDate>
          <key **xmlns="http://myportal.com/schema/common/elements/v1.0"**>00121be8-968f-4dbf-9d5c-d7b81e127a36</key>
          <name>Aplha</name>
          <code>76542</code>
          <createdDate **xmlns="http://myportal.com/schema/common/elements/v1.0"**>2014-03-26T16:36:52.794876</createdDate>
          <stream>Online</stream>
</category> 

问题以粗体突出显示,为什么默认序列化器将整个命名空间放在那里,为什么不能在顶部声明它并使用前缀。整个命名空间膨胀了数据包的大小。

类别实体如下所示

[System.CodeDom.Compiler.GeneratedCodeAttribute("System.Xml", "4.0.30319.18058")]
[System.SerializableAttribute()]
[System.Diagnostics.DebuggerStepThroughAttribute()]
[System.ComponentModel.DesignerCategoryAttribute("code")]
[System.Xml.Serialization.XmlTypeAttribute(AnonymousType=true, Namespace="http://myportal.com/schema/category/v1.0", TypeName="category")]
[System.Xml.Serialization.XmlRootAttribute(Namespace="http://myportal.com/schema/category/v1.0", IsNullable=false, ElementName="category")]
public partial class CategoryType : BaseType


    /// <remarks/>
    [System.Xml.Serialization.XmlElementAttribute(Namespace = "http://myportal.com/schema/common/elements/v1.0", Order = 0, ElementName = "key")]
    public string Key
    
        get
        
            return this.keyField;
        
        set
        
            this.keyField = value;
        
    

    /// <remarks/>
    [System.Xml.Serialization.XmlElementAttribute(Order = 1, ElementName = "code")]
    public string Code
    
        get
        
            return this.codeField;
        
        set
        
            this.codeField = value;
        
    

如何强制 XmlElementAttribute 使用前缀而不是完整的命名空间?

谢谢,

视频

【问题讨论】:

【参考方案1】:

最后我能够解决这个问题,我所有的 DTO (XSD) 都是名为 BaseType 的同一父类的扩展。我必须添加一个带有 XmlNamespaceDeclarations 修饰的公共字段,该字段在序列化之前就被咨询了。

    #region Public Fields
    /// <summary>
    /// This is considered at the time of serialization for adding namespace prefixes,
    /// The namespaces are built in the default constructor, it queries a Constant that in chance fetches the namespace(s) from configuration file
    /// </summary>
    [XmlNamespaceDeclarations]
    public XmlSerializerNamespaces Prefixes; 
    #endregion

    #region Public Constructors
    /// <summary>
    /// Builds namespace prefixes for serialization
    /// </summary>
    public BaseType()
    
        Prefixes = new XmlSerializerNamespaces();
        int index = 1;
        Constants.NAMESPACES
            .ForEach(tempNamespace =>
                Prefixes.Add(Constants.PREFIX_LETTER + index++, tempNamespace)
            );
     
    #endregion

我希望这个对某人有所帮助。

干杯,

视频

【讨论】:

以上是关于WCF 序列化长命名空间被重复而不是前缀的主要内容,如果未能解决你的问题,请参考以下文章

更改前缀命名空间 WCF 信封请求

WCF 客户端,XML 命名空间前缀导致空对象

WCF - 反序列化时控制命名空间

XML 序列化和命名空间前缀

XML:一个命名空间前缀被声明为未声明,而事实上它是

Jackson XML - 使用命名空间前缀反序列化 XML