代码之家  ›  专栏  ›  技术社区  ›  JoelFan

我真的需要写这个“序列化助手”吗?

  •  5
  • JoelFan  · 技术社区  · 14 年前

    我刚刚写的 序列化帮助程序 上课,但我不敢相信这是必要的!

    using System.IO;
    using System.Xml.Serialization;
    
    public static class SerializationHelper
    {
        public static string Serialize<T>(T obj)
        {
            var outStream = new StringWriter();
            var ser = new XmlSerializer(typeof(T));
            ser.Serialize(outStream, obj);
            return outStream.ToString();
        }
    
        public static T Deserialize<T>(string serialized)
        {
            var inStream = new StringReader(serialized);
            var ser = new XmlSerializer(typeof(T));
            return (T)ser.Deserialize(inStream);
        }
    }
    

    它的用法如下:

    var serialized = SerializationHelper.Serialize(myObj);
    

    还有:

    var myObj = SerializationHelper.Deserialize<MyType>(serialized)
    

    我是否在.NET框架中缺少某些内容?这不是火箭科学!

    2 回复  |  直到 14 年前
        1
  •  0
  •   Grant Palin Bob King    14 年前

    如果您在一个项目中进行任何实际数量的序列化/反序列化(>1),这将非常有用。我曾经遇到过这种情况,所以我只是在一个utils库中放置了一个类似的类,以及其他可重用的函数。

        2
  •  1
  •   Christian Hayter    14 年前

    实际上,您调用.NET API的位是:

    var ser = new XmlSerializer(typeof(T));
    ser.Serialize(outStream, obj);
    
    var ser = new XmlSerializer(typeof(T));
    var obj = (T) ser.Deserialize(inStream);
    

    剩下的代码是你的个人专长。我不认为两行代码对于调用API来说太多了。你可以把它们浓缩,例如

    (new XmlSerializer(typeof(T))).Serialize(outStream, obj);
    
    var obj = (T) (new XmlSerializer(typeof(T))).Deserialize(inStream);
    

    仅仅作为一个旁白,我应该指出,我把把把XML数据存储在字符串变量中看作是一种代码味道。一旦将XML数据从原始二进制形式中取出( XDocument , XmlDocument , XPathDocument 或者任何其他类型的DOM),都会遇到编码问题。如果开发人员将对象序列化为带编码X的字符串,然后将该字符串写入带编码Y的磁盘文件,该怎么办?不太安全。除此之外,如果编码X不是UTF-16,您将如何用.NET字符串表示数据?