Xml сериализация
От: Аноним  
Дата: 22.03.14 08:17
Оценка:
Все привет.

Есть классы:
[Serializable]
[XmlRoot("root")]
public class ClassB
{
  private ClassA someObj;
  
  public ClassB()
  {
    someObj = new ClassA();
  }
  
  [XmlAttribute]
  public String Name
  {
    get;
    set;
  }

  [XmlAttribute]
  public Int32 Value
  {
    get;
    set;
  }

  [XmlText(typeof(ClassA))]
  public ClassA SomeObj
  {
    get { return someObj; }
    set { someObj = value; }
  }
}


сериализую так:
var obj = new ClassB(){Name = "name", Value = 123, SomeObj = new ClassA(){SomeValue = "test_classA"} };
using (var writer = new StreamWriter(@"d:\out.xml"))
{
    var xml = new XmlSerializer(typeof(ClassB)); 
    xml.Serialize(writer, obj);
}


В итоге получаю xml:
<?xml version="1.0" encoding="utf-8"?>
<root xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" Name="name" Value="123">
  <SomeObj>test_classA</SomeObj>
</root>


но мне мне нужно, чтобы test_classA не был обрамлен тегом SomeObj.
т.е.

<?xml version="1.0" encoding="utf-8"?>
<root xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" Name="name" Value="123">test_classA</root>


Пробовал указать атрибут для SomeObj
[XmlText(typeof(ClassA))]
public ClassA SomeObj

но получаю ошибку
An unhandled exception of type 'System.InvalidOperationException' occurred in System.Xml.dll

Additional information: Возникла ошибка при отражении типа "ConsoleApplication3.ClassB".


Подскажите, что делаю не так и как правильно настроить сериализацию с помощью атрибутов, чтобы добиться нужного мне поведения?
Если атрибутами не получится, то только реализовывать IXmlSerializable?
Re: Xml сериализация
От: codenet Россия  
Дата: 23.03.14 05:56
Оценка:
Здравствуйте, Аноним

XmlText не умеет сериализовать составные типы в Вашем случае (ClassA). Если Вам не критично сделайте [XmlIgnore] для SomeObj ,и добавьте классу (ClassB) свойства типа string которое вытащит someObj.SomeValue, и этому свойству уже присвойте атрибут XmlText;
Иначе даже не знаю как решить эту задачу.
Re[2]: Xml сериализация
От: Аноним  
Дата: 23.03.14 06:34
Оценка:
Здравствуйте, codenet, Вы писали:

C>Здравствуйте, Аноним


C>XmlText не умеет сериализовать составные типы в Вашем случае (ClassA). Если Вам не критично сделайте [XmlIgnore] для SomeObj ,и добавьте классу (ClassB) свойства типа string которое вытащит someObj.SomeValue, и этому свойству уже присвойте атрибут XmlText;

C>Иначе даже не знаю как решить эту задачу.

Спасибо за ответ. Жаль. Не подскажите, где написано об этом ограничении? Я не нашел ничего в мсдн (может плохо искал?).
Re[3]: Xml сериализация
От: Михаил Романов Удмуртия https://mihailromanov.wordpress.com/
Дата: 23.03.14 10:12
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Спасибо за ответ. Жаль. Не подскажите, где написано об этом ограничении? Я не нашел ничего в мсдн (может плохо искал?).

В статье XmlTextAttribute Class:

You can apply the XmlTextAttribute to public fields and public read/write properties that return primitive and enumeration types

Re[4]: Xml сериализация
От: Аноним  
Дата: 23.03.14 12:51
Оценка:
Здравствуйте, Михаил Романов, Вы писали:

МР>Здравствуйте, Аноним, Вы писали:


А>>Спасибо за ответ. Жаль. Не подскажите, где написано об этом ограничении? Я не нашел ничего в мсдн (может плохо искал?).

МР>В статье XmlTextAttribute Class:
МР>

You can apply the XmlTextAttribute to public fields and public read/write properties that return primitive and enumeration types


Спасибо! Пропустил.
Re[4]: Xml сериализация
От: codenet Россия  
Дата: 23.03.14 13:51
Оценка:
Здравствуйте, Михаил Романов, Вы писали:

МР>Здравствуйте, Аноним, Вы писали:


А>>Спасибо за ответ. Жаль. Не подскажите, где написано об этом ограничении? Я не нашел ничего в мсдн (может плохо искал?).

МР>В статье XmlTextAttribute Class:
МР>

You can apply the XmlTextAttribute to public fields and public read/write properties that return primitive and enumeration types


Было бы интересно поведение, если объект оверрайдит ToString или неявное приведение типа к стрингу к примеру " implicit operator string(Object a)" (к строке я взял чисто символично) ,то разрешить такую возможность ( использовать атрибут [XmlText] ), не понимаю ,почему не сделали так,а почему бы и нет ?, есть мысли ?) или просто так исторически сложилось
Re[5]: Xml сериализация
От: koodeer  
Дата: 23.03.14 13:58
Оценка:
Здравствуйте, codenet, Вы писали:

C>Было бы интересно поведение, если объект оверрайдит ToString или неявное приведение типа к стрингу к примеру " implicit operator string(Object a)" (к строке я взял чисто символично) ,то разрешить такую возможность ( использовать атрибут [XmlText] ), не понимаю ,почему не сделали так,а почему бы и нет ?, есть мысли ?) или просто так исторически сложилось


А обратный процесс — десериализацию — как в таком случае делать?
Re[5]: Xml сериализация
От: Михаил Романов Удмуртия https://mihailromanov.wordpress.com/
Дата: 23.03.14 14:02
Оценка:
Здравствуйте, codenet, Вы писали:

C>не понимаю ,почему не сделали так,а почему бы и нет ?, есть мысли ?

Ну как минимум из соображения того, что операция сериализации должна быть обратима, а значит обязана существовать парная операция, аналогичная Parse, к тому же ToString(), это скорее пользовательское представление (что используется довольно часто, например, для показа значений в отладчике), а оно обычно слабо подходит для обратимой сериализации.

Так что решение в виде IXMLSerializable выглядит нормальным компромиссом.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.