【问题标题】:DataContractSerializer: preserve string member that happens to be raw xml?DataContractSerializer:保留恰好是原始 xml 的字符串成员?
【发布时间】:2010-06-01 15:00:20
【问题描述】:

我对 DataContract 范式有点缺乏经验,并且遇到了反序列化问题。我有一个字符串字段,但它包含 xml 并且没有正确反序列化。我有一种感觉,这是因为 DCS 将其视为序列化程序的输入,而不是不透明的字符串对象。

是否有某种方法可以在代码中标记 DataMember 以表示“这是一个字符串,不要将其内容视为 xml”,类似于 XmlIgnore?

谢谢!

【问题讨论】:

    标签: wcf xml-serialization datacontractserializer


    【解决方案1】:

    嗯,相当于[XmlIgnore] 只是不把 [DataMember] 放在你的属性/字段上 - 如果你用[DataMember] 装饰所有东西,否则。

    但我不明白您如何告诉 DataContractSerializer 将该属性视为不透明字符串而不是其他任何内容。

    您可以尝试拥有一个单独的属性,在内容字符串之前添加<![CDATA[,在内容字符串之后添加]]>,并序列化该属性而不是原始XML 属性(通过使用[DataMember] 属性装饰该新属性)。

    类似这样的:

     public string XmlContent { get; set; }
    
     [DataMember]
     public string XmlContentSafe 
     { 
        get { return "<![CDATA[" + XmlContent + "]]>"; }
     }
    

    也许这样你就可以欺骗 DCS 了? (我自己从未尝试过 - 只是猜测......)

    【讨论】:

    • 是的,我想 XmlIgnore 并不是我想要的,因为我希望传输字段,而不是序列化。我想我希望 DataMember 有一个技巧来表明您希望将成员序列化为某种类型。不过我会试试 CData 的东西!
    【解决方案2】:

    事实证明,最简单的方法就是在从数据库中检索来自 sql server 的 xml 字段时将其转换为 varchar(max)。

     CAST(CONVERT(XML,[RawXml],0) AS VARCHAR(MAX)) AS RawXml
    

    在这种情况下,序列化程序似乎会根据需要忽略它。 不过感谢您的帮助!

    【讨论】:

      【解决方案3】:

      有一种简单的方法,只需将原始 XML 的属性声明为 XmlElement

      [DataMember]
      public XmlElement RawXML { private get; set; }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2023-03-21
        • 2018-03-10
        • 2010-12-18
        • 2012-08-27
        • 2012-01-04
        • 2021-12-05
        • 2022-01-13
        相关资源
        最近更新 更多