我们如何从XMLSerializer函数传递多个对象

HmX*_*mXa 1 c# xml-serialization

我们如何通过函数重载方法传递不同类的不同对象?

示例代码:

static public void SerializeToXML(Movie movie)
{
    XmlSerializer serializer = new XmlSerializer(typeof(Movie));
    TextWriter textWriter = new StreamWriter(@"C:\movie.xml");
    serializer.Serialize(textWriter, movie);
    textWriter.Close();
}
Run Code Online (Sandbox Code Playgroud)

当我使用这段代码时:

static public void SerializeToXML(FbTextView p, FbTextField q)
{
    try
    {
        XmlSerializer textviewserilizer = new XmlSerializer(typeof(FbTextView));
        XmlSerializer textfieldserilizer = new XmlSerializer(typeof(FbTextField));

        TextWriter textWriter = new StreamWriter(@"D:\movie.xml");
        textviewserilizer.Serialize(textWriter, p);
        textfieldserilizer.Serialize(textWriter, q);
        textWriter.Close();
    }
    catch (Exception ex)
    {
        while (ex != null)
        {
            Trace.WriteLine(ex.Message);
            ex = ex.InnerException;
            MessageBox.Show(ex.Message);
        }
        throw;
    }
}
Run Code Online (Sandbox Code Playgroud)

它的输出xml显示一些结果:

XML Parsing Error: junk after document element 
Location: file:///D:/movie.xml
Line Number 6, Column 14:</FbTextView><?xml version="1.0" encoding="utf-8"?>
                         -------------^ 
Run Code Online (Sandbox Code Playgroud)

Joh*_*son 6

您可以使用generics以下方式编写它:

public static void SerializeToXml<T>(this T objectToSerialize, string fileName)
{
    XmlSerializer serializer = new XmlSerializer(objectToSerialize.GetType());
    using (TextWriter textWriter = new StreamWriter(fileName))
    {
        serializer.Serialize(textWriter, objectToSerialize);
    }
}
Run Code Online (Sandbox Code Playgroud)
  • 一般来说,泛型可能有点令人困惑,但绝对值得学习.简而言之,您的方法接受任何类型.
  • 接受每种类型可能过于自由,然后你可以constrain只接受某些类型.
  • 将文件名作为参数传递给方法似乎是个好主意,否则您只能使用该方法写入一个文件(名称).
  • 你也可以阅读有关 using statement
  • 正如LB建议你可以extension method通过在第一个参数之前添加this关键字来将方法转换为a .
  • 如果要将其实现为扩展方法,则方法和类必须是静态的.

如果您将SerializeToXml方法作为扩展方法,则可以通过以下两种方式之一调用它,结果将是相同的:

movie.SerializeToXml(@"C:\movie.xml");

SerializeToXml(movie, @"C:\movie.xml");
Run Code Online (Sandbox Code Playgroud)