我正在尝试序列化和反序列化 Node 对象树。我的抽象“节点”类以及从它派生的其他抽象和具体类在我的“Informa”项目中定义。此外,我在 Informa 中创建了一个用于序列化/反序列化的静态类。
首先,我将树解构为Dictionary(guid,Node)类型的平面列表,其中 guid 是 Node 的唯一 ID。
我能够毫无问题地序列化我的所有节点。但是当我尝试反序列化时,我得到以下异常。
第 1 行位置 227 出错。元素“ http://schemas.microsoft.com/2003/10/Serialization/Arrays:Value ”包含“Informa:Building”数据合同的数据。反序列化器不知道映射到该合约的任何类型。将与“Building”对应的类型添加到已知类型列表中 - 例如,通过使用 KnownTypeAttribute 或将其添加到传递给 DataContract Serializer 的已知类型列表中。
从 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;
}
}