protobuf-net десериализует базовый класс в унаследованный класс - PullRequest
1 голос
/ 28 июня 2011

У меня есть базовый класс, который сериализован.

[ProtoContract]
public class Web2PdfEntity 
{   


        [ProtoMember(1)]
        public string Title { get; set; }
        [ProtoMember(2)]
        public string CUrl { get; set; }
}

Я бы хотел десериализовать класс Web2PdfEntity в Web2PdfServer, который унаследован от Web2PdfEntity.

public class Web2PdfServer : Web2PdfEntity
{

public void MyServerMethod {}
public void MyServerMethod2{}
}

Я попытался использовать код ниже для десериализации класса, к сожалению, свойства не установлены.

var web2Pdf = Serializer.Deserialize<Web2PdfServer>("c:\Web2PdfEntity-class-to-serialize-file.bin");
web2Pdf.Title //<- not deserialized
web2Pdf.CURL //<- not deserialized

1 Ответ

2 голосов
/ 28 июня 2011

(сильно переработано)

На основании комментариев представлен сценарий:

  • есть два типа, которые бывают подклассами в C #
  • при сериализации, мы просто хотим просто поменять их местами - без кода наследования (т. Е. Вы можете сохранить как Web2PdfEntity и загрузить как Web2PdfServer или v.v.)

Это немного отличается от нормального варианта использования, когда унаследованные типы ожидают наследования во время сериализации (которая изменяет данные), а несвязанные типы взаимозаменяемы, пока подходит контракт.

Есть несколько способов приблизиться к этому; одна небольшая проблема заключается в том, что по умолчанию не смотрит на унаследованные свойства, чтобы избежать дублирования. Вы могли бы рекламировать их, но это немного неловко. Лично я думаю, что мне хотелось бы просто сказать, что делать во время запуска приложения:

var metaType = RuntimeTypeModel.Default.Add(typeof(Web2PdfServer), false);
metaType.Add(1, "Title").Add(2, "CUrl");

Теперь ваш существующий код Serializer будет корректно обрабатывать Web2PdfServer, включая два указанных свойства.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...