c#中的序列化和反序列化

本文关键字:反序列化 序列化 | 更新日期: 2023-09-27 18:08:38

我在做序列化时遇到了一个问题&使用c#进行反序列化。基本上,我正在使用DataContractSerializer来序列化一个对象。

这是我的序列化代码:

 var serializer = new DataContractSerializer(typeof(ProjectSetup));
     string xmlString;
     using (var sw = new StringWriter())
         {
             using (var writer = new XmlTextWriter(sw))
                 {
                  writer.Formatting = Formatting.Indented;
                  serializer.WriteObject(writer, DALProjectSetup);
                  writer.Flush();
                  xmlString = sw.ToString();
                 }
          }                
      System.Web.HttpContext.Current.Session["ProjectSetup"] = xmlString;

这是正常工作,但现在我需要帮助如何反序列化上述

c#中的序列化和反序列化

Valentin的回答向您展示了如何反序列化。

你的评论:

我得到这个错误:类型'System.Collections '的get-only集合。哈希表'返回空值。如果实例为空,则输入流包含不能添加的集合项。

(注意HashTable通常也值得避免)

这是因为DataContractSerializer 不运行构造函数,所以如果您有:

private readonly HashTable myData = new HashTable();
[DataMember]
public HashTable MyData { get { return myData; } }

或:

private readonly HashTable myData;
[DataMember]
public HashTable MyData { get { return myData; } }
public MyType() {
    myData = new HashTable();
}

则反序列化时myData始终为null。一些想法:

首先,尝试添加一个私有集合;例如:

[DataMember]
public HashTable MyData { get; private set; }
public MyType() {
    MyData = new HashTable();
}

否则,您可以使用反序列化前的回调:

[OnDeserializing]
void OnSerializing(StreamingContext ctx) {
    myData = new HashTable();
}
private HashTable myData = new HashTable();
[DataMember]
public HashTable MyData { get { return myData; } }

或者:使属性更智能:

private HashTable myData;
[DataMember]
public HashTable MyData { get { return myData ?? (myData = new HashTable()); } }

我想以下可以工作吗?

string toDeserialise = yourValue;
using(StringReader sr = new StringReader(toDeserialize))
using(XmlTextReader xmlReader = new XmlTextReader(sr))
{
   return (ProjectSetup)serializer.ReadObject(xmlReader);
}