2010-03-29 6 views
1

Je suis en train de parler à un programme C# qui utilise protobuf-net à partir d'un iPhone en utilisant http://code.google.com/p/metasyntactic/wiki/ProtocolBuffersprotobuf-net - contre-apostrophes, fichiers Dictionnaires et .proto

Malheureusement, le fichier .proto m'a donné (généré du C# code source) comprend une ligne qui protoc rejette:

repeated Pair_Guid_List`1 Local = 6; 

Il semble que ce soit parce que les données source est un C# Dictionnaire, avec une clé Guid et une classe en tant que valeur. Existe-t-il un moyen de mieux gérer cela?

La version de protobuf-net utilisée est r278.zip.

(C# envoyer et recevoir ces protobufs tout fonctionne très bien, il est juste quand nous ajoutons l'iPhone dans le mélange que cela devient un problème.)

MISE À JOUR: tous travailler grâce à Marc!

L'objet du côté C# est avéré être:

[ProtoMember(7)] 
public Dictionary<Guid, List<Pages>> ReceivedPages { get; set; } 

qui a bien fonctionné en utilisant ce qui suit dans le .proto:

message PagesDict { 
    required bcl.Guid guid = 1; 
    repeated Pages Pages = 2; 
} 

avec le message en question contenant:

repeated PagesDict ReceivedPages = 7; 

Répondre

1

Premièrement - essayez-vous d'utiliser protobuf-net sur l'iPhone? v1 ne devrait pas fonctionner via monotouch; v2 fonctionne (c'était un gros pilote pour le travail v2), mais n'est pas encore sorti (il est utilisable mais incomplet pour le moment). Faites-moi savoir si vous essayez de faire cela, car il serait important ;-p

Je suppose qu'ils ont obtenu ce .proto en appelant Serializer.GetProto<T>, qui n'est malheureusement pas infaillible, en particulier lorsque des choses comme Dictionary<,> sont impliqués (Je vais ajouter un TODO pour essayer de résoudre ce problème en v2).

Les bonnes nouvelles sont que modélise Dictionary<TKey,TValue> comme repeated someType, où someType devrait être:

message someType { 
    required keyType key = 1; 
    required valueType value = 2; 
} 

Et Guid est modélisé comme bcl.Guid (bcl.proto), qui est:

message Guid { 
    optional fixed64 lo = 1; // the first 8 bytes of the guid 
    optional fixed64 hi = 2; // the second 8 bytes of the guid 
} 

Remarque , cependant, qu'aucun "proto" n'est nécessaire si vous travaillez .NET-to-.NET; juste des types compatibles.

+0

Merci pour votre réponse Mark! J'utilise http://code.google.com/p/metasyntactic/wiki/ProtocolBuffers sur l'iphone - ceci génère du code Objective C natif à partir du fichier .proto. Il utilise en effet Serializer.GetProto . Merci pour la description de la modélisation - Je vais essayer de définir le message comme ça. – JosephH

+0

Juste pour dire, j'ai tout compris. L'objet du côté C# s'est avéré être: [ProtoMember (7)] public Dictionary > ReceivedPages {get; ensemble; } qui a bien fonctionné en utilisant ce qui suit dans le fichier .proto: message PagesDict { requis bcl.Guid guid = 1; Pages répétées Pages = 2; } répété PagesDict ReceivedPages = 6; – JosephH