Все привет.
Есть классы:
[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?
Здравствуйте, Аноним, Вы писали:
А>Спасибо за ответ. Жаль. Не подскажите, где написано об этом ограничении? Я не нашел ничего в мсдн (может плохо искал?).
В статье
XmlTextAttribute Class:
You can apply the XmlTextAttribute to public fields and public read/write properties that return primitive and enumeration types
Здравствуйте, Михаил Романов, Вы писали:
МР>Здравствуйте, Аноним, Вы писали:
А>>Спасибо за ответ. Жаль. Не подскажите, где написано об этом ограничении? Я не нашел ничего в мсдн (может плохо искал?).
МР>В статье XmlTextAttribute Class:
МР>You can apply the XmlTextAttribute to public fields and public read/write properties that return primitive and enumeration types
Спасибо! Пропустил.
Здравствуйте, Михаил Романов, Вы писали:
МР>Здравствуйте, Аноним, Вы писали:
А>>Спасибо за ответ. Жаль. Не подскажите, где написано об этом ограничении? Я не нашел ничего в мсдн (может плохо искал?).
МР>В статье 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] ), не понимаю ,почему не сделали так,а почему бы и нет ?, есть мысли ?) или просто так исторически сложилось
Здравствуйте, codenet, Вы писали:
C>Было бы интересно поведение, если объект оверрайдит ToString или неявное приведение типа к стрингу к примеру " implicit operator string(Object a)" (к строке я взял чисто символично) ,то разрешить такую возможность ( использовать атрибут [XmlText] ), не понимаю ,почему не сделали так,а почему бы и нет ?, есть мысли ?) или просто так исторически сложилось
А обратный процесс — десериализацию — как в таком случае делать?