Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
序列化不带XmlInclude的数据_Xml_Serialization_Xml Serialization - Fatal编程技术网

序列化不带XmlInclude的数据

序列化不带XmlInclude的数据,xml,serialization,xml-serialization,Xml,Serialization,Xml Serialization,我试图在我创建的存储库类中引用我的派生类 代码如下: [XmlInclude(typeof(Case1))] [XmlInclude(typeof(Case2))] [XmlInclude(typeof(Case3))] public class FileRepo: IFileRepo { public string Name { set; get; } public DateTime Time { get; set; } public bool Correct{ get

我试图在我创建的存储库类中引用我的派生类

代码如下:

[XmlInclude(typeof(Case1))]
[XmlInclude(typeof(Case2))]
[XmlInclude(typeof(Case3))]
public class FileRepo: IFileRepo
{
    public string Name { set; get; }
    public DateTime Time { get; set; }
    public bool Correct{ get; set; }

    public void SerializetoXml(IFileRepo repo)
    {

        var filename = string.Format("{0}__{1}", DateTime.Now.ToString("yyMMddhhss"), "Log.xml");
        var path =
            @"C:\Temp;
        if (!Directory.Exists(path))
            Directory.CreateDirectory(path);
        var fullpath = Path.Combine(path, filename);


        var serializer = new XmlSerializer((typeof(FileRepo))); 
        var textwriter = new StreamWriter(fullpath);

        serializer.Serialize(textwriter, repo);
        textwriter.Close();  
    }
}

基本上,我正在尝试“引用”所有这些类,而不必为每个类放置XmlInclude。请列出解决此问题的任何示例或引用。

您可以将要“包括”的类型传递给
XmlSerializer
构造函数,如下所示

public class StackOverflow_15887772
{
    //[XmlInclude(typeof(Case1))]
    //[XmlInclude(typeof(Case2))]
    //[XmlInclude(typeof(Case3))]
    public class FileRepo
    {
        public string Name { set; get; }
        public DateTime Time { get; set; }
        public bool Correct { get; set; }
    }

    public class Case1 : FileRepo { public string Data { get; set; } }
    public class Case2 : FileRepo { public string Data { get; set; } }
    public class Case3 : FileRepo { public string Data { get; set; } }

    public static void SerializetoXml(FileRepo repo)
    {
        MemoryStream ms = new MemoryStream();
        var serializer = new XmlSerializer(typeof(FileRepo), new Type[] { typeof(Case1), typeof(Case2) });
        serializer.Serialize(ms, repo);
        Console.WriteLine("Serialized type {0}:", repo.GetType().Name);
        Console.WriteLine(Encoding.UTF8.GetString(ms.ToArray()));
    }

    public static void Test()
    {
        SerializetoXml(new Case1 { Data = "case 1", Correct = true, Name = "goo", Time = DateTime.UtcNow });
        SerializetoXml(new Case2 { Data = "case 2", Correct = true, Name = "goo", Time = DateTime.UtcNow });
        try
        {
            // this will fail, Case3 isn't passed to the XmlSerializer .ctor
            SerializetoXml(new Case3 { Data = "case 3", Correct = true, Name = "goo", Time = DateTime.UtcNow });
        }
        catch (Exception ex)
        {
            Console.WriteLine("{0}: {1}", ex.GetType().FullName, ex.Message);
            Exception inner = ex.InnerException;
            while (inner != null)
            {
                Console.WriteLine("    {0}: {1}", inner.GetType().FullName, inner.Message);
                inner = inner.InnerException;
            }
        }
    }
}
我知道这很旧,但我使用这里的信息创建了一个通用方法,它适用于我,如下所示:

    public static string toXML<T>(this T obj)
    {
        using (StringWriter writer = new StringWriter())
        {
            XmlSerializer serializer = new XmlSerializer(typeof(T), new Type[] { obj.GetType() });
            serializer.Serialize(writer, obj);
            return writer.ToString();
        }
    }
公共静态字符串toXML(此T对象)
{
使用(StringWriter=新StringWriter())
{
XmlSerializer serializer=新的XmlSerializer(typeof(T),新类型[]{obj.GetType()});
serializer.Serialize(writer,obj);
返回writer.ToString();
}
}