在生成的类之间共享反序列化代码 - 泛型或通过部分类继承注入?

时间:2016-06-10 11:29:26

标签: c# xml generics serialization

我有一些生成的类(来自Xsd.exe),它允许我序列化/反序列化Xml。其中一个例子是生成的partial class accidents

我还有一些实用程序代码(见下文),我在另一个文件中添加了该类。问题是这个代码对于我想要使用的每个生成的类都是相同的,而不是typeof(accidents)

首先,似乎泛型应该可用。但我不确定我会这样做。然后我想知道,我可以通过我的分类引入一个共同的基类吗?或者还有其他一些聪明的方法吗?

public partial class accidents
{
    private static System.Xml.Serialization.XmlSerializer serializer;

    private static System.Xml.Serialization.XmlSerializer Serializer
    {
        get
        {
            if ((serializer == null))
            {
                serializer = new System.Xml.Serialization.XmlSerializer(typeof(accidents));
            }
            return serializer;
        }
    }


    #region Serialize/Deserialize
    /// <summary>
    /// Serializes current accidents object into an XML document
    /// </summary>
    /// <returns>string XML value</returns>
    public virtual string Serialize()
    {
        System.IO.StreamReader streamReader = null;
        System.IO.MemoryStream memoryStream = null;
        try
        {
            memoryStream = new System.IO.MemoryStream();
            Serializer.Serialize(memoryStream, this);
            memoryStream.Seek(0, System.IO.SeekOrigin.Begin);
            streamReader = new System.IO.StreamReader(memoryStream);
            return streamReader.ReadToEnd();
        }
        finally
        {
            if ((streamReader != null))
            {
                streamReader.Dispose();
            }
            if ((memoryStream != null))
            {
                memoryStream.Dispose();
            }
        }
    }

1 个答案:

答案 0 :(得分:1)

我可以提供以下变体。为序列化创建一个单独的类助手。

public static class GenericSerializer
{
    public static string Serialize<T>(T value)
    {
        using (var stringWriter = new StringWriter())
        {
            var serializer = new XmlSerializer(typeof(T));
            serializer.Serialize(stringWriter, value);
            return stringWriter.GetStringBuilder().ToString();
        }
    }
}

用法

var acc = new accidents();
var str = GenericSerializer.Serialize(acc);

可以从生成的类中完全删除所有支持序列化代码。