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;
这是正常工作,但现在我需要帮助如何反序列化上述
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);
}