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);
    }