【问题标题】:Using generics with XmlSerializer将泛型与 XmlSerializer 一起使用
【发布时间】:2011-02-09 20:08:32
【问题描述】:

在 C# 中使用 XML 序列化时,我使用如下代码:

public MyObject LoadData()
{
    XmlSerializer xmlSerializer = new XmlSerializer(typeof(MyObject));
    using (TextReader reader = new StreamReader(settingsFileName))
    {
        return (MyObject)xmlSerializer.Deserialize(reader);
    }
}

(以及类似的反序列化代码)。

它需要强制转换并且不是很好。有没有办法直接在 .NET Framework 中使用带有序列化的泛型?也就是这样写:

public MyObject LoadData()
{
    // Generics here.
    XmlSerializer<MyObject> xmlSerializer = new XmlSerializer();
    using (TextReader reader = new StreamReader(settingsFileName))
    {
        // No casts nevermore.
        return xmlSerializer.Deserialize(reader);
    }
}

【问题讨论】:

  • 不存在上面示例中所示的通用XmlSerializer。如果您需要此功能,则需要创建自己的包装器。
  • 死灵术,但我不得不回应上面的评论:当然它不存在,这就是问这个问题的原因。如果存在,该示例将按原样运行。

标签: c# generics oop xml-serialization xmlserializer


【解决方案1】:

总是为我工作

  public static string ObjectToXmlSerialize<T>(T dataToSerialize)
    {
        try
        {
            var stringwriter = new System.IO.StringWriter();
            var serializer = new XmlSerializer(typeof(T));
            serializer.Serialize(stringwriter, dataToSerialize);
            return stringwriter.ToString();
        }
        catch (Exception ex)
        {
        }
        return null;
    }

这是用于反序列化的:

  public static T XmlDeserializeToObject<T>(string xmlText)
    {
        try
        {
            var stringReader = new System.IO.StringReader(xmlText);
            var serializer = new XmlSerializer(typeof(T));
            return (T)serializer.Deserialize(stringReader);
        }
        catch (Exception ex)
        {
        }
        return default(T);
    }

【讨论】:

    【解决方案2】:

    试试这个。

    public class SerializeConfig<T> where T : class
    {
        public static void Serialize(string path, T type)
        {
            var serializer = new XmlSerializer(type.GetType());
            using (var writer = new FileStream(path, FileMode.Create))
            {
                serializer.Serialize(writer, type);
            }
        }
    
        public static T DeSerialize(string path)
        {
            T type;
            var serializer = new XmlSerializer(typeof(T));
            using (var reader = XmlReader.Create(path))
            {
                type = serializer.Deserialize(reader) as T;
            }
            return type;
        }
    }
    

    【讨论】:

      【解决方案3】:

      一个简单的通用包装器:

      public class GenericSerializer<T> : XmlSerializer
      {
          public GenericSerializer(): base(typeof(T)) { }
      }
      

      这会将您的对象序列化到 bin/debug 文件夹:

      static void Main(string[] args)
      {
         Person p = new Person { Name = "HelloWorld" };
         GenericSerializer<Person> ser = new GenericSerializer<Person>();
         ser.Serialize(new StreamWriter("person.xml"), p);
      }
      

      【讨论】:

        【解决方案4】:

        除了@Oded,您还可以制作method Generic

        public T ConvertXml<T>(string xml)
        {
            var serializer = new XmlSerializer(typeof(T));
            return (T)serializer.Deserialize(new StringReader(xml));
        }
        

        这样你就不需要使整个类通用,你可以像这样使用它:

        var result = ConvertXml<MyObject>(source);
        

        【讨论】:

        • 接受这个答案,而不是 Oded 一个,因为这个不需要类,事实上,大多数时候,我不想创建一个(例如,在一个小项目,所有 XML 数据都从一个类访问)。感谢大家的回答。
        • 为什么这个答案被接受了?它包含代码错误(使用中的分号)并且 XmlSerializer 类不是 IDisposable,因此不能在 using 范围内使用,因此它不会编译有两个原因...
        • @Koen,抱歉错过了,感谢您的提醒。已更正。
        • 知道如何将它与 xgenplus.codeplex.com 或 MS SGen msdn.microsoft.com/en-us/library/bk3w6240(vs.80).aspx 这样的程序集生成器一起使用
        【解决方案5】:

        使您的序列化类/方法通用:

        public T LoadData<T>()
        {
            XmlSerializer xmlSerializer = new XmlSerializer(typeof(T));
            using (TextReader reader = new StreamReader(settingsFileName))
            {
                return (T)xmlSerializer.Deserialize(reader);
            }
        }
        

        【讨论】:

        • 这就是我在大多数项目中所做的。但我只是想知道为什么它没有嵌入到 .NET Framework 的最新版本中。
        猜你喜欢
        • 2019-03-21
        • 2015-09-12
        • 2017-10-14
        • 1970-01-01
        • 2010-09-08
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多