protobuf-net не поддерживает блестящий для расширений; вам нужно использовать номера полей (я не думаю, что это что-то делает с fltColumns
на данный момент). Однако, чтобы получить значения из , вы должны использовать Extensible.GetValue<T>
/ TryGetValue<T>
(обратите внимание на себя: создайте эти методы расширения в C # 3.0). Чтобы установить значение, используйте AppendValue<T>
- он не может знать, является ли это одиночным значением или списком (repeated
), поэтому один и тот же API обрабатывает оба сценария.
Возможно, версия Джона (намного ближе к версии Java) имеет лучшую поддержку здесь.
Пример (я использую рукописные классы для краткости, но он должен работать и с сгенерированными типами):
static void Main()
{
MyData data = new MyData();
data.Id = 123;
// something we know only by field id...
Extensible.AppendValue<string>(data, 27, "my name");
string myName = Extensible.GetValue<string>(data, 27);
// this should be OK too (i.e. if we loaded it into something that
// *did* understand that 27 means Name)
MyKnownData known = Serializer.ChangeType<MyData, MyKnownData>(data);
Console.WriteLine(known.Id);
Console.WriteLine(known.Name);
}
[ProtoContract]
class MyData : Extensible
{
[ProtoMember(1)]
public int Id { get; set; }
}
[ProtoContract]
class MyKnownData
{
[ProtoMember(1)]
public int Id { get; set; }
[ProtoMember(27)]
public string Name{ get; set; }
}