DataContractSerializer и известные типы - PullRequest
2 голосов
/ 24 февраля 2012

Я сериализую объект в коде (не через вызов WCF), и я немного зациклен на известных типах (я использовал их с WCF, но не с сериализатором DataContract в качестве «автономного»)serializer)

Я получаю исключение при запуске кода ниже.Я ожидал, что он будет работать без ошибок, потому что я предоставил известные типы.Что я тут не так делаю?


public class Parent {}
public class Child: Parent {}

// the code -- serialized is a serialized Child
// type is typeof(Parent) (I know it works if I pass typeof(Child), but isn't that what Known Types is all about??

// passing the known types seems to make no difference -- this only works if I pass typeof(Child) as the first param
var serializer = new DataContractSerializer(parentType, new Type[] {typeof(Child)});
object test = serializer.ReadObject(serialized);

1 Ответ

11 голосов
/ 24 февраля 2012

Хорошо, у меня один из тех дней, когда я продолжаю отвечать на себя. Проблема не в десериализации, а в сериализации - вы должны создать сериализатор с тем же базовым типом, что и десериализатор (я создал сериализатор на основе дочернего типа). Для чего это стоит, рабочий код ниже:


{
            var child = new Child();
            // here is where I went wrong before -- I used typeof(Child), with no known types to serialize
            var serializer = new DataContractSerializer(typeof(Parent), new Type[] { typeof(Child) });
            var stream = new MemoryStream();
            serializer.WriteObject(stream, child);
            stream.Position = 0;
            serializer = new DataContractSerializer(typeof(Parent), new Type[] { typeof(Child) });
            object test = serializer.ReadObject(stream);
            stream.Dispose();
            Console.WriteLine(test.ToString());
            Console.ReadLine();
}

...