【发布时间】:2010-10-18 17:23:18
【问题描述】:
我正在尝试序列化和反序列化 Node 对象树。我的抽象“节点”类以及从它派生的其他抽象和具体类在我的“Informa”项目中定义。此外,我在 Informa 中创建了一个用于序列化/反序列化的静态类。
首先,我将树解构为 Dictionary(guid,Node) 类型的平面列表,其中 guid 是节点的唯一 ID。
我能够毫无问题地序列化我的所有节点。但是当我尝试反序列化时,会出现以下异常。
第 1 行位置 227 错误。元素 'http://schemas.microsoft.com/2003/10/Serialization/Arrays:Value' 包含的数据 “Informa:Building”数据合同。这 解串器没有任何知识 映射到此合同的类型。添加 与“建筑”对应的类型 到已知类型的列表 - 对于 例如,通过使用 KnownTypeAttribute 或将其添加到 传递给的已知类型列表 DataContract 序列化程序。
从 Node 派生的所有类(包括 Building)都应用了 [KnownType(typeof(type t))] 属性。
我的序列化和反序列化方法如下:
public static void SerializeProject(Project project, string filePath)
{
try
{
Dictionary<Guid, Node> nodeDic = DeconstructProject(project);
Stream stream = new FileStream(filePath, FileMode.Create, FileAccess.Write, FileShare.None);
//serialize
DataContractSerializer ser = new DataContractSerializer(typeof(Dictionary<Guid, Node>),"InformaProject","Informa");
ser.WriteObject(stream,nodeDic);
// Cleanup
stream.Close();
}
catch (Exception e)
{
MessageBox.Show("There was a problem serializing " + Path.GetFileName(filePath) + ". \n\nException:" + e.Message, "Doh!", MessageBoxButtons.OK, MessageBoxIcon.Error);
throw e;
}
}
public static Project DeSerializeProject(string filePath)
{
try
{
Project proj;
// Read the file back into a stream
Stream stream = new FileStream(filePath, FileMode.Open, FileAccess.Read, FileShare.Read);
DataContractSerializer ser = new DataContractSerializer(typeof(Dictionary<Guid, Node>), "InformaProject", "Informa");
Dictionary<Guid, Node> nodeDic = (Dictionary<Guid, Node>)ser.ReadObject(stream);
proj = ReconstructProject(nodeDic);
// Cleanup
stream.Close();
return proj;
}
catch (Exception e)
{
MessageBox.Show("There was a problem deserializing " + Path.GetFileName(filePath) + ". \n\nException:" + e.Message, "Doh!", MessageBoxButtons.OK, MessageBoxIcon.Error);
return null;
}
}
【问题讨论】:
-
重新扁平化为字典 - 在这里查看我的答案:stackoverflow.com/questions/736568/…
-
答案已编辑以澄清
标签: c# serialization datacontractserializer