Существует два способа решения неизвестных «общих» типов; во-первых, использовать свойство shim, например свойство, которое представляет значение как нечто похожее (например, string
или long
):
[ProtoMember(8)]
public string Foo {
get { ... read from the other member ... }
set { ... assign the other member ... }
}
Другой подход - суррогат , который является вторым контрактом protobuf, который автоматически подставляется. Требования к использованию суррогата:
- должен быть определенный оператор преобразования (неявный или явный) между двумя типами (например,
DateTimeOffset
и DateTimeOffsetSurrogate
)
- затем вы используете
SetSurrogate(surrogateType)
для обучения protobuf-net, например RuntimeTypeModel.Default.Add(typeof(DateTimeOffset), false).SetSurrogate(typeof(DateTimeOffsetSurrogate));
свойство shim проще, но требует повторения для каждого члена. Суррогат применяется автоматически ко всем экземплярам типа в модели. Затем суррогат следует стандартным правилам protobuf-net, поэтому вы можете указать, какие элементы сериализировать и т. Д.
РЕДАКТИРОВАТЬ: Пример добавления кода
using System;
using ProtoBuf;
[ProtoContract]
public class DateTimeOffsetSurrogate
{
[ProtoMember(1)]
public string DateTimeString { get; set; }
public static implicit operator DateTimeOffsetSurrogate(DateTimeOffset value)
{
return new DateTimeOffsetSurrogate {DateTimeString = value.ToString("u")};
}
public static implicit operator DateTimeOffset(DateTimeOffsetSurrogate value)
{
return DateTimeOffset.Parse(value.DateTimeString);
}
}
Тогда зарегистрируйте это так
RuntimeTypeModel.Default.Add(typeof(DateTimeOffset), false).SetSurrogate(typeof(DateTimeOffsetSurrogate));