Скажем, у меня есть следующий базовый класс:
[DataContract]
[Serializable]
public abstract class DimensionEntity
{
[DataMember(Order = 1)]
private readonly Date effectiveDatespan;
...
}
И следующий производный класс:
[DataContract]
[Serializable]
public class ClearingSite : DimensionEntity
{
[DataMember(Order = 1)]
private readonly string code;
...
}
Когда я сериализую экземпляр ClearingSite
следующим образом:
model.Add(typeof(ClearingSite), true);
model.Serialize(ms, clearingSite);
Я вижу, что только code
элемент ClearingSite
сериализуется; значение элемента effectiveDatespan
базового класса не сериализуется.
Два примечания:
- Я вижу, что член
BaseType
добавленногоProtoBuf.Meta.MetaType
имеет значениеnull
, из-за чего членeffectiveDatespan
не сериализуется; вместо этого, если я скомпилирую модель, ее элементBaseType
будет правильно установлен вDimensionEntity
(хотя позже произойдет сбой, поскольку элементы равныprivate readonly
и, следовательно, недоступны для скомпилированной модели); - Конечно, я могу объявить
ClearingSite
известным типомDimensionEntity
, но я не понимаю, зачем это нужно: я не сериализуюDimensionEntity
, я сериализую (и десериализую)ClearingSite
, и, кроме того,DataContractSerializer
делает не требует, чтобы я добавлялKnownType
кDimensionEntity
, если я сериализуюClearingSite
.
Из других ответов Марка похоже, что Protobuf потребует атрибут KnownType
(или ProtoInclude
), чтобы получить «важный номер поля» (цитата), но это, похоже, не так, поскольку CompiledModel
работает полностью хорошо без ProtoInclude
.
Обратите внимание, что я стараюсь использовать только атрибуты System.Runtime.Serialization
, так как я пытаюсь, чтобы моя объектная модель не знала о сериализаторах в будущем.