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

Ani*_*nil 1 c#

我在使用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;
Run Code Online (Sandbox Code Playgroud)

这工作正常,但现在我需要有关如何反序列化上述内容的帮助.

Mar*_*ell 8

Valentin的答案向您展示了如何反序列化.

你的评论:

我收到此错误:'System.Collections.Hashtable'类型的只获取集合返回一个空值.输入流包含集合项,如果实例为null,则无法添加这些集合项.

(注意HashTable一般也值得避免)

那是因为DataContractSerializer 没有运行构造函数,所以如果你有:

private readonly HashTable myData = new HashTable();
[DataMember]
public HashTable MyData { get { return myData; } }
Run Code Online (Sandbox Code Playgroud)

要么:

private readonly HashTable myData;
[DataMember]
public HashTable MyData { get { return myData; } }
public MyType() {
    myData = new HashTable();
}
Run Code Online (Sandbox Code Playgroud)

然后myData将永远null用于反序列化.一些想法:

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

[DataMember]
public HashTable MyData { get; private set; }
public MyType() {
    MyData = new HashTable();
}
Run Code Online (Sandbox Code Playgroud)

否则,您可以使用before-deserialization回调:

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

或者:使财产更加智能化:

private HashTable myData;
[DataMember]
public HashTable MyData { get { return myData ?? (myData = new HashTable()); } }
Run Code Online (Sandbox Code Playgroud)