Re protobuf-net, который я поддерживаю:
Проблема здесь не в типах значений (с которыми она часто справляется) - это использование object
, что означает, что она просто не знает, какие данные ожидать, и, следовательно, как кодировать / декодировать это.
В настоящее время я не могу придумать простой / чистый способ справиться с этим. Он будет обрабатывать ряд общих сценариев типа значений, списков и любого уровня иерархии на основе контрактов (контракт на данные, протоконтракты или некоторые xml-схемы), но для этого требуется ключ .
Возможно, если вы сможете уточнить пример использования, я мог бы помочь больше? Например, приведенное выше не очень хорошо работает с DataContractSerializer
или XmlSerializer
либо ...
Re dotnet-protobufs; Я не могу комментировать, но я уверен, что это будет еще менее прощающим; он предназначен для использования с классами, сгенерированными из файла .proto, поэтому object
просто никогда не войдет в модель (Джон: поправьте меня, если я ошибаюсь).
Если вы оставите больше информации, не могли бы вы оставить комментарий здесь? Так что я могу легко его найти ... Либо напишите мне письмо напрямую (см. Мой профиль SO).
edit - вот хакерская вещь, которую я имел в виду - в данный момент она не работает, но я выясню, почему завтра (возможно). Обратите внимание, что теоретически все дополнительные члены могут быть приватными - я просто пытаюсь упростить процесс отладки. Обратите внимание, что это не займет никакого дополнительного места. Как я уже сказал, сегодня это не работает, но должно - я пойму, почему ...
[ProtoContract]
public class FieldData
{
public object Value {get;set;}
[ProtoMember(1)]
public int ValueInt32 {
get { return (int)Value; } set { Value = value; } }
public bool ValueInt32Specified {
get { return Value != null && Value is int; } set { } }
[ProtoMember(2)]
public float ValueSingle {
get { return (float)Value; } set { Value = value; } }
public bool ValueSingleSpecified {
get { return Value != null && Value is float; } set { } }
// etc for expected types
}