【问题标题】:Serialize different classes with same Method in c#在c#中使用相同的方法序列化不同的类
【发布时间】:2017-12-10 18:12:00
【问题描述】:

我有不同的可序列化的类。

我有一个方法,看起来像这样:

public void Serialize(List<ClassName1> CT, string Address)
{
    ...
    XmlSerializer serializer = new XmlSerializer(typeof(List<ClassName1>));
    ...
}

为了序列化 ClassName1,我可以使用这个函数,但我不能将它用于名为 ClassName2 的第二个类。 类不同,但都是可序列化的。

我现在可以复制和粘贴方法并更改类,但我觉得这很愚蠢,因为方法的唯一区别是名称。

我试着这样做:

public void Serialize(List<object> CT, string Address)
{
    ...
    XmlSerializer serializer = new XmlSerializer(typeof(List<object>));
    ...
}

因为我认为一切都是 c# 中的“对象”,但是当我使用它时,我得到“无法转换”错误。

xml.Serialize(listNumber, Address);

我觉得这可以用泛型解决,但我从来没有使用过任何类型的泛型,所以我完全不知道它是否应该以及如何工作。

【问题讨论】:

  • 您可以使用静态方法创建一个静态类,例如public static void SerializeDynamicClass&lt;T&gt;(this T clsObject) where T : class { "Do your XmlSerializer code here"}

标签: c# class generics serialization


【解决方案1】:

这是泛型的理想用法:

public void Serialize<T>(List<T> CT, string Address)
{
    ...
    XmlSerializer serializer = new XmlSerializer(typeof(List<T>));
    ...
}

在大多数情况下,您甚至不必更改调用代码 - 编译器会自动推断泛型类型参数。

【讨论】:

    【解决方案2】:

    由于XmlSerializerSerialize 方法有一个object 参数供要序列化的对象使用,因此只需这样做。

    public void Serialize(object obj, string Address)
    {
        ...
        XmlSerializer serializer = new XmlSerializer(obj.GetType());
        ...
    }
    

    除非您的方法对列表执行其他操作,否则使用泛型似乎没有任何优势。在这种情况下,请使用 Marc Gravell 的方法。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-06-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-12-23
      • 2015-07-04
      • 1970-01-01
      相关资源
      最近更新 更多