2009-03-25 5 views
1

У меня есть классы, как этот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. Отсутствие контроля над тем, как объект сериализуется за пределами установки имени и порядок

ведет меня задаться вопросом, не является это не разрешимая проблема.


я знал, это может быть сделано с IXmlSerializable и ReadXml/WriteXml, потому что я должен быть удаление кода, который делает именно это.

ответ

1

Внесите IXmlSerializable в класс Bar, а затем произведите вывод <Bar>String from baz.ToString()</Bar> при сериализации.

Вы можете оставить класс Foo как есть, а DataContractSerializer позаботится обо всем остальном.

+0

Но как бы вы иметь дело с дополнительными свойствами в классе «Бар» в этом сценарии? –

+0

То есть * точно * код, с которым я был связан, избавился от :) – BCS

+0

@marc_s & BCS: Если вы реализуете IXmlSerializable, DataContractSerializer использует эту реализацию для вывода, так что разработчик должен решить, что делать с дополнительные свойства. – casperOne

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; 
} 
Смежные вопросы