2010-01-12 113 views
5

我刚写了这个SerializationHelper类,但我不敢相信这是必要的!我真的需要写这个“SerializationHelper”吗?

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

和:

在.NET框架
var myObj = SerializationHelper.Deserialize<MyType>(serialized) 

我缺少的东西?这不是航天科技!

+0

我在.NET框架中没有看到任何东西来取代你的泛型序列化实现。 – 2010-01-12 16:20:45

+5

这可能是一个从-100开始的特征(用于解释http://blogs.msdn.com/ericlippert/archive/2009/06/15/making-it-easier.aspx)。 BCL设计人员一定不会认为从xml字符串创建对象(反之亦然)是值得为API添加特性的所有工作 - 尤其是*,因为它不是火箭科学! – 2010-01-12 16:22:40

+0

正常情况下,序列化是T的函数,而不是通用的序列化器。这是因为并不总是需要序列化类中的所有内容以便恢复它,因此具有特定知识的类是进行此活动的更好的消息灵通的地方。 – Lazarus 2010-01-12 16:24:20

回答

0

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

1

其实不然,在那里你调用.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,XmlDocumentXPathDocument或任何其他类型的DOM)中取出,就会遇到编码问题。如果开发人员将对象串行化为带有编码X的字符串,然后将该字符串写入具有编码Y的磁盘文件?不是很安全。除此之外,如果编码X不是UTF-16,你甚至会如何表示.NET字符串中的数据?

+0

你在最后一行错过了T到T。 ..否则我得到一个“对象”。而且你正在离开你“凝结”的事实,我必须明确地提及类型名称,我的解决方案忽略 – JoelFan 2010-01-12 16:46:22

+0

看得很清楚,我编辑了文本。 – 2010-01-12 16:49:40

+0

乔尔,我同意,这是很多打字。你必须问问自己,在什么时候写一个实用的方法来节省你自己的打字时间会浪费时间?如果你的方法真正节省了你的时间并使你的代码更具可读性,那么这很好,保持它们。我所说的是,'XmlSerializer' API的设计者并不赞同你的观点。 – 2010-01-12 16:52:15