我在使用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)
这工作正常,但现在我需要有关如何反序列化上述内容的帮助.
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)
| 归档时间: |
|
| 查看次数: |
2020 次 |
| 最近记录: |