Я пытаюсь сериализовать и десериализовать дерево объектов Node. Мой абстрактный класс "Node", а также другие абстрактные и конкретные классы, производные от него, определены в моем проекте "Informa". Кроме того, я создал статический класс в Informa для сериализации / десериализации.
Сначала я деконструирую свое дерево в плоский список типа Словарь (guid, Node) , где guid - это уникальный идентификатор Node.
Я могу сериализовать все мои узлы без проблем. Но когда я пытаюсь десериализовать, я получаю следующее исключение.
Ошибка в строке 1 позиции 227. Элемент
«http://schemas.microsoft.com/2003/10/Serialization/Arrays:Value'
содержит данные
Информационный договор «Информа: Строительство».
десериализатор не имеет никакого знания
введите, что соответствует этому контракту. добавлять
тип, соответствующий «зданию»
к списку известных типов - для
Например, используя
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;
}
}