2011-02-17 47 views
0

在阅读了大部分内容之后,我花了最近几个小时的时间阅读了以下代码,看起来过时了,或者看起来似乎不起作用。使用dot.net序列化和反序列化XML#

如果对任何人的帮助是最终的工作代码。自由随意评论,如果能:-)

public class SerializationHelper<T> { 

#region static string SerializeObject(T obj, Encoding encoding) 

/// <summary> 
/// Serialize an [object] to an Xml String. 
/// </summary> 
/// <typeparam name="T">Object Type to Serialize</typeparam> 
/// <param name="obj">Object Type to Serialize</param> 
/// <param name="encoding">System.Text.Encoding Type</param> 
/// <returns>Empty.String if Exception, XML string if successful</returns> 
/// <example> 
/// // UTF-16 Serialize 
/// string xml = SerializationHelper<ObjectType>SerializeObject([object], new UnicodeEncoding(false, false)); 
/// </example> 
/// <example> 
/// // UTF-8 Serialize 
/// string xml = SerializationHelper<ObjectType>SerializeObject([object], Encoding.UTF8); 
/// </example> 
public static string SerializeObject(T obj, Encoding encoding) { 

    if (obj == null) { return string.Empty; } 

    try { 

    XmlSerializer xmlSerializer = new XmlSerializer(typeof(T)); 

    using (MemoryStream memoryStream = new MemoryStream()) { 

     XmlWriterSettings xmlWriterSettings = new XmlWriterSettings() { Encoding = encoding }; 

     using (XmlWriter writer = XmlWriter.Create(memoryStream, xmlWriterSettings)) { 

     xmlSerializer.Serialize(writer, obj); 

     } 

     return encoding.GetString(memoryStream.ToArray()); 

    } 

    } 
    catch { 

    return string.Empty; 

    } 

} 

#endregion 

#region static T DeserializeObject(string xml, Encoding encoding) 

/// <summary> 
/// Deserialize an Xml String to an [object] 
/// </summary> 
/// <typeparam name="T">Object Type to Deserialize</typeparam> 
/// <param name="xml">Xml String to Deserialize</param> 
/// <param name="encoding">System.Text.Encoding Type</param> 
/// <returns>Default if Exception, Deserialize object if successful</returns> 
/// <example> 
/// // UTF-16 Deserialize 
/// [object] = SerializationHelper<ObjectType>DeserializeObject(xml, Encoding.Unicode) 
/// </example> 
/// <example> 
/// // UTF-8 Deserialize 
/// [object] = SerializationHelper<ObjectType>DeserializeObject(xml, Encoding.UTF8) 
/// </example> 
public static T DeserializeObject(string xml, Encoding encoding) { 

    if (string.IsNullOrEmpty(xml)) { return default(T); } 

    try { 

    XmlSerializer xmlSerializer = new XmlSerializer(typeof(T)); 

    using (MemoryStream memoryStream = new MemoryStream(encoding.GetBytes(xml))) { 

     // No settings need modifying here 
     XmlReaderSettings xmlReaderSettings = new XmlReaderSettings(); 

     using (XmlReader xmlReader = XmlReader.Create(memoryStream, xmlReaderSettings)) { 

     return (T)xmlSerializer.Deserialize(xmlReader); 

     } 

    } 

    } 
    catch { 

    return default(T); 

    } 

} 

#endregion  

} 
+1

好吧,这是代码 - 那么你的问题是什么?!?!你是否得到错误 - 如果是这样的话:**什么**错误?代码没有按照您期望的那样执行?如果是这样:你期望什么,你会得到什么?阅读关于[如何在SO上提出一个好问题](http://tinyurl.com/so-hints) – 2011-02-17 05:34:58

+0

它不是一个概述性的问题,看看它是否正确,可以改进。在阅读了很多关于谷歌我遇到这个代码的许多不同版本,正如我所说的大多数是使用过时的方法,有些只是明显不工作。我也注意到,在这里特别是很多人输入答案,例如'我刚刚输入了这个我的头,它可能工作我不知道,但你明白'它是一个很好的手势,但有时不会很高兴在这里找到代码实际工作,经过测试,并被同意成为其他人的最佳实践,同时添加输入。 – 2011-02-17 06:09:21

回答

0

改善我建议把这个类型参数T封装类,并使得XmlSerializer实例static。泛型类中的静态字段是封闭类型,因此SerializationHelper<Apple>SerializationHelper<Orange>将分别具有该字段的单独实例。

此外,我不确定catch { return String.Empty; }是否是最好的主意 - 屏蔽问题以避免崩溃会让我感到紧张。

0

我认为不需要整个编码部分。您只需使用一种编码进行序列化,然后转换为字节,然后再转换回Unicode。这是为什么?但我可能会在这里错过一些东西。

击中我的另一件事是.ToArray()用法。如果你有很大的hiearchy和连续化的对象,这可能会非常沉重。尝试使用StreamReader读取内存流,而无需将其复制到Array中。但是这需要一些性能测试来支持我的推理。