XML和DataContractSerializer

时间:2009-03-25 20:15:33

标签: .net xml datacontractserializer

我有这样的课程

[DataContract(Namespace = "")]
public class Foo
{
    [DataMember(Order = 0)]
    Bar bar;
}

[DataContract(Namespace = "")]
public class Bar
{
    Baz baz;

    [DataMember(Order = 0)]
    string TheBaz
    {
        get { baz.ToString(); }
        set { SomeOtherCode(value); }
    }
}

我想让它像这样生成XML

<Foo>
    <Bar>String from baz.ToString()</Bar>
</Foo>

但我得到的更像是:

<Foo>
    <Bar><TheBaz>String from baz.ToString()</TheBaz></Bar>
</Foo>

可以解决这个问题吗? This artical说DataContractSerializer的一个缺点是:

  
      
  1. 在设置名称和顺序
  2. 之外无法控制对象的序列化方式   

让我想知道这不是一个可以解决的问题。


我知道这可以通过IXmlSerializableReadXml / WriteXml来完成,因为我应该删除那样做的代码。

2 个答案:

答案 0 :(得分:1)

Bar类上实施IXmlSerializable,然后在序列化时输出<Bar>String from baz.ToString()</Bar>

您可以按原样保留Foo类,DataContractSerializer将完成剩下的工作。

答案 1 :(得分:1)

我意识到我的第一个答案完全是假的 - 但你可以欺骗财产:

[DataContract(Namespace = "")]
public class Foo
{
    [DataMember(Order = 0, Name="Bar")]
    private string BazString {
        get {
            return bar == null ? null : bar.TheBaz.ToString();
        }
        set {
            if(value == null) {
                bar = null;
            }
            else {
                if(bar == null) bar = new Bar();
                bar.TheBaz = value;
            }
        }
    }

    Bar bar;
}