【问题标题】:C# xml serializationC# xml 序列化
【发布时间】:2011-04-28 10:26:29
【问题描述】:

我在 c# 中将一个对象序列化为 xml,我想序列化

public String Marker { get; set; }

进入

<Marker></Marker>

当字符串 Marker 没有值时。

现在我明白了

<Marker />

对于Marker == string.Emptynull 没有标记节点。 我怎样才能得到这个?

【问题讨论】:

  • 我认为您应该详细说明为什么要这样做。从语义上讲,这两种形式没有区别,所以如果你正在编写一个它们不可互换的系统,它会让任何将来看到它的人(包括你自己)感到困惑。
  • 为什么要关心元素是短格式还是扩展格式?它不会改变意思......
  • 只是您更喜欢&lt;Marker&gt;&lt;/Marker&gt; 表示还是有技术原因?它几乎没有任何区别(实际上,我想到的只有 HTML &lt;script&gt; 标签 - 这是由于浏览器的缺陷)。
  • 我知道这并没有改变意思,但服务器(旧电话中心)端的解析器只排除扩展表单。
  • 您是只编写 XML 数据还是还需要消费/读取 XML?如果您只需要阅读,最好使用XmlWriter 类。

标签: c# .net xml xml-serialization xmlserializer


【解决方案1】:

如果Marker 属性为空,您可以轻松抑制&lt;Marker&gt; 元素。只需添加一个ShouldSerializeMarker() 方法:

public bool ShouldSerializeMarker()
{
    return Marker != null;
}

XmlSerializer 会自动调用它来决定是否在输出中包含该元素。

至于在字符串为空时使用 &lt;Marker&gt; 元素的扩展形式,没有简单的方法来做到这一点(您可以可能编写自己的 XmlWriter,但它会是痛苦)。但无论如何它没有意义,因为&lt;Marker /&gt;&lt;Marker&gt;&lt;/Marker&gt; 具有完全相同的含义。

【讨论】:

    【解决方案2】:

    如果你想拥有结束标签,你必须改变你的 xml 结构的实现;据我了解,只有在序列化“复杂”对象(例如:类)而不是“简单”对象(例如:字符串)时,才会生成单独的结束标签。

    一个例子是:

    [XmlRoot]
    public class ClassToSerialize
    {
      private StringWithOpenAndClosingNodeClass mStringWithOpenAndClosingNode;
    
      [XmlElement]
      public StringWithOpenAndClosingNodeClass Marker
      {
        get { return mStringWithOpenAndClosingNode ?? new StringWithOpenAndClosingNodeClass(); }
        set { mStringWithOpenAndClosingNode = value; }
      }
    }
    
    [XmlRoot]
    public class StringWithOpenAndClosingNodeClass
    {
      private string mValue;
    
      [XmlText]
      public string Value
      {
        get { return mValue ?? string.Empty; }
        set { mValue = value; }
      }
    }
    

    如果你将此对象序列化为 XML,你会得到:

    <ClassToSerialize><Marker></Marker></ClassToSerialize>
    

    我希望这会有所帮助!

    【讨论】:

    • 好主意,但是当我序列化ClassToSerialize 时,我得到&lt;ClassToSerialize&gt; &lt;Marker /&gt; &lt;/ClassToSerialize&gt;。不过还是谢谢。
    • 不,这不是真的,因为 Marker 被表示为一个单独的类(顺便说一句,这个单独的类可以重用于需要遵循相同模式的其他字符串属性)
    【解决方案3】:

    您可以使用XMLElementAttributeIsNullable 属性来配置XmlSerializer 以为您的null 值生成XML。

    不过,还没有弄清楚如何为没有值的元素生成打开和关闭元素。您已经拥有的是完全合法的 XML。也就是说,

    <Marker></Marker> 
    

    相同
    <Marker/>
    

    真的需要开始标签和结束标签吗?

    【讨论】:

    • 不幸的是...服务器端的解析器仅扩展表单除外。较短的表单会返回错误,但是当我手动发送扩展表单时,它就像一个魅力。
    • 因此,您编写文件后的解决方案是通过循环遍历文件将所有较短的表单替换为扩展的表单。
    • 这是个好主意。如果没有更快的解决方案出现,我将其称为我的应急计划。
    • @Jonah 你需要求助于你的应急计划吗?
    猜你喜欢
    • 2011-05-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-02
    • 2012-09-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多