C# 在序列化列表中,派生类的序列化方式不同
我有基类和一些派生类向基类添加属性 到目前为止,我一直在序列化和反序列化包含派生类的混合对象的列表,我要做的唯一一件事是添加C# 在序列化列表中,派生类的序列化方式不同,c#,xml-serialization,xml-deserialization,C#,Xml Serialization,Xml Deserialization,我有基类和一些派生类向基类添加属性 到目前为止,我一直在序列化和反序列化包含派生类的混合对象的列表,我要做的唯一一件事是添加[xmlclude(typeof(child))]和C#来处理其余的部分 这次我想直接序列化/反序列化派生类的对象,而不是将其放入列表中。最有趣的是,当我序列化列表中的对象时,生成的xml不同于“直接”序列化。此外,我不能将直接序列化的对象反序列化为它的基类项的实例,而列表反序列化很好(我在下面添加了一个示例) 这是示例类的代码: [XmlInclude(typeo
[xmlclude(typeof(child))]
和C#来处理其余的部分
这次我想直接序列化/反序列化派生类的对象,而不是将其放入列表中。最有趣的是,当我序列化列表中的对象时,生成的xml不同于“直接”序列化。此外,我不能将直接序列化的对象反序列化为它的基类项的实例,而列表反序列化很好(我在下面添加了一个示例)
这是示例类的代码:
[XmlInclude(typeof(child))]
public abstract class father
{ ... }
public class child : father
{
public double Sum { get; set; }
public char Currency { get; set; }
}
下面是以下示例的init代码:
father oD = new child() { Currency = '$', Sum = 1 };
string xml_str = Tools.Serialize(oD);
XML输出为:
<child xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"><Sum>1</Sum><Currency>36</Currency></child>
是否有办法强制对象序列化为其基类(如列表中所示)?也许可以帮助您。@kvantt我正在寻找相反的方法。。。当我使用List时,反序列化工作正常。
<ArrayOfFather xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"><father xsi:type="child"><Sum>1</Sum><Currency>36</Currency></father></ArrayOfFather>
<father xsi:type="child"><Sum>1</Sum><Currency>36</Currency></father>
child oD1 = Tools.DeSerializeGeneric<child>(xml_str);
father oD2 = Tools.DeSerializeGeneric<child>(xml_str);
father oD4 = Tools.DeSerializeGeneric<father>(xml_str);
System.InvalidOperationException: There is an error in XML document (1, 2). ---> System.InvalidOperationException: <child xmlns=''> was not expected.
at Microsoft.Xml.Serialization.GeneratedAssembly.XmlSerializationReaderfather.Read4_father()
--- End of inner exception stack trace ---
at System.Xml.Serialization.XmlSerializer.Deserialize(XmlReader xmlReader, String encodingStyle, XmlDeserializationEvents events)
at System.Xml.Serialization.XmlSerializer.Deserialize(TextReader textReader)
at Tools.DeSerializeGeneric[T](String source) in Dev-testing:\Tools.cs:line 1549
at Program.Main(String[] args) in Dev-testing:\Program.cs:line 48
public static T DeSerializeGeneric<T>(string source)
{
XmlSerializer x = new XmlSerializer(typeof(T));
StringReader SsR = new StringReader(source);
return (T) x.Deserialize(SsR);
}