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

时间:2012-11-02 22:48:20

标签: 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();
}

当我使用此代码时:

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

其输出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"?>
                         -------------^ 

2 个答案:

答案 0 :(得分: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);
    }
}
  • 一般来说,泛型可能有点令人困惑,但绝对值得学习。简而言之,您的方法接受任何类型。
  • 接受每种类型可能过于宽松,然后你可以constrain只接受某些类型。
  • 将文件名作为参数传递给您的方法似乎是个好主意,否则您只能使用该方法写入一个文件(名称)。
  • 您还可以阅读using statement
  • 由于L.B建议您可以通过在第一个参数之前添加this关键字将您的方法转换为extension method
  • 如果要将其实现为扩展方法,则方法和类必须是静态的。

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

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

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

答案 1 :(得分:3)

这里可以使用扩展方法

var xml = movie.SerializeToXML();

public static class SOExtensions
{
    public static string SerializeToXML<T>(this T obj)  where T : new()
    {
        StringWriter s = new StringWriter();
        XmlSerializer serializer = new XmlSerializer(typeof(T));
        serializer.Serialize(s, obj);
        return s.ToString();
    }
}

对于@ JohnSaunders'评论:“ - 1,直到您将StringWriter放入使用块”

  

“StringWriter Class”实现TextWriter以将信息写入字符串。信息存储在基础 StringBuilder 中。 http://msdn.microsoft.com/en-us/library/system.io.stringwriter.aspx

以下是StringWriter的代码及其基类dispose。

//StringWriter
protected override void Dispose(bool disposing)
{
    this._isOpen = false;
    base.Dispose(disposing);
}

//TextWriter
protected virtual void Dispose(bool disposing)
{
}