简体   繁体   English

派生类的XML反序列化

[英]XML deserialization of derived classes

How can I create deserialization method that can take an object of class or any of derived classes? 如何创建可以接受类对象或任何派生类的反序列化方法?

public class Config
{
    public string appname;
}

public class CustomConfig1 : Config
{
    public string CustomConfig1Param1;
    public string CustomConfig1Param2;
}

public class CustomConfig2 : Config
{
    public string CustomConfig2Param1;
    public string CustomConfig2Param2;
}

I want to get something like serialization method that defines type of input object: 我想得到类似序列化方法的东西,该方法定义了输入对象的类型:

public string serialize(object obj)
{
    XmlSerializer serializer = new XmlSerializer(obj.GetType());
    StringWriter serialized = new StringWriter();
    serializer.Serialize(serialized, obj);
    return serialized.ToString();
}

But when I read an XML from DB I can't define the type of object, so I can't pass it to XmlSerializer . 但是,当我从数据库读取XML时,我无法定义对象的类型,因此无法将其传递给XmlSerializer It may be the Config object or any of derived classes 它可以是Config对象或任何派生类

Please help. 请帮忙。 How can I define the type of input object? 如何定义输入对象的类型?

[XmlInclude(typeof(CustomConfig1))]
[XmlInclude(typeof(CustomConfig2))]
public class Config
{
    public string appname;
}

Then just serialize/deserialize specifying typeof(Config) ; 然后只需序列化/反序列化指定typeof(Config) ; the library will give you back an instance of the appropriate type based on the data. 该库将根据数据为您提供适当类型的实例。


Edit: full example, including the preference to not hard-code the sub-types: 编辑:完整示例,包括不对子类型进行硬编码的首选项:

using System;
using System.IO;
using System.Xml.Serialization;

public class Config
{
    public string appname;
}

public class CustomConfig1 : Config
{
    public string CustomConfig1Param1;
    public string CustomConfig1Param2;
}

public class CustomConfig2 : Config
{
    public string CustomConfig2Param1;
    public string CustomConfig2Param2;
}

static class Program
{
    static void Main()
    {
        var original = new CustomConfig1
        {
            appname = "foo",
            CustomConfig1Param1 = "x",
            CustomConfig1Param2 = "y"
        };
        var xml = Serialize(original);
        var clone = DeserializeConfig(xml);
        Console.WriteLine(clone.appname);
        var typed = (CustomConfig1)clone;
        Console.WriteLine(typed.CustomConfig1Param1);
        Console.WriteLine(typed.CustomConfig1Param2);
    }
    public static string Serialize(Config obj)
    {
        using (var serialized = new StringWriter())
        {
            GetConfigSerializer().Serialize(serialized, obj);
            return serialized.ToString();
        }
    }
    public static Config DeserializeConfig(string xml)
    {
        using(var reader = new StringReader(xml))
        {
            return (Config)GetConfigSerializer().Deserialize(reader);
        }
    }
    static Type[] GetKnownTypes()
    {
        // TODO: resolve types properly
        return new[] { typeof(CustomConfig1), typeof(CustomConfig2) };
    }
    private static XmlSerializer configSerializer;
    public static XmlSerializer GetConfigSerializer()
    {
        return configSerializer ?? (configSerializer =
            new XmlSerializer(typeof(Config), GetKnownTypes()));
    }
}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM