2011-11-06 3 views
1

J'écris certaines structures de données génériques personnalisées. Comment puis-je m'assurer que le type générique transmis peut être sérialisé par protobuf-net? Comme protobuf-net ne s'appuie pas sur des interfaces, je ne peux pas contraindre le paramètre type de cette façon. J'ai pensé au test d'exécution du type dans le constructeur, mais je ne peux même pas utiliser PrepareSerializer<T> parce que cela dépend du type étant un type de référence. Je pourrais simplement essayer une sérialisation et une désérialisation, mais cela semble au mieux désordonné. Quelle est la meilleure façon de vérifier qu'un type générique donné peut être sérialisé?Comment déterminer si un paramètre de type générique peut être sérialisé par protobuf-net?

Répondre

1

XmlProtoSerializer doit faire une détermination similaire. Par exemple:

static int GetKey(TypeModel model, ref Type type, out bool isList) 
{ 
    if (model != null && type != null) 
    { 
     int key = model.GetKey(ref type); 
     if (key >= 0) 
     { 
      isList = false; 
      return key; 
     } 
     Type itemType = TypeModel.GetListItemType(type); 
     if (itemType != null) 
     { 
      key = model.GetKey(ref itemType); 
      if (key >= 0) 
      { 
       isList = true; 
       return key; 
      } 
     } 
    } 

    isList = false; 
    return -1; 
} 

Si cela renvoie une valeur négative, il ne peut pas être sérialisé. Je pourrais rendre ceci disponible dans un bool CanSerialize(Type) plus soutenu si cela serait utile?

+0

Je vais regarder dans la méthode 'GetKey', mais je pense que' Serializer.CanSerialize (Type) 'serait une méthode fantastique et utile! – dlras2

+0

@Dan Je n'ai pas oublié à ce sujet - juste besoin de passer par oredev d'abord! –

+0

Il n'y a pas d'urgence. (En fait, vous êtes le seul développeur gratuit que je connaisse qui s'excuse pour un retard après seulement deux jours.) Mais si vous pouviez mettre à jour cette réponse et me direz quand ça sortira, ce serait génial! En attendant, je vais vous accorder le bénéfice du doute et accepter cette réponse. =] – dlras2

Questions connexes