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



我有一些生成的类(来自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();
            }
        }
    }

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

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

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

最新更新