Question

J'ai une classe de base dans un ensemble et un grand nombre de classes générées dans une autre héritant de la classe de base. L'utilisation de sérialiser une liste du type de base protobuf-net (r282) échoue lorsque l'on tente de résoudre le subclassType (ligne 248 de SerializerT.cs) parce que la sous-classe est pas dans l'ensemble de la classe de base. Le déplacement des classes ensemble ne sont pas une option privilégiée et il est assez important que je puisse passer autour Liste.

Voici ma classe de base étiquetée. Les types inclus sont marqués par ProtoMember(x) au besoin.

[ProtoContract] 
[ProtoInclude(1,"SomeItemType")]
[ProtoInclude(2,"AnotherItemType")]
[ProtoInclude(190,"YetAnotherItemType")]
public abstract class BaseItem
{
}

Comme une note de côté, cela fait partie de l'évaluation en utilisant protobuf-net pour remplacer BinaryFormatter pour déplacer des données entre une application de bureau et un service web SOAP.

Puis-je faire ce genre de chose du tout? Y at-il une meilleure façon? Est-ce que je manque juste quelque chose d'évident? Une question à plus long terme est séparée dois-je faire quoi que ce soit un peu différent pour se préparer à un éventuel déménagement à 3,5?

Était-ce utile?

La solution

Peut-être la meilleure façon d'utiliser ProtoInclude est avec typeof, car cela va gérer beaucoup de nuances pour vous automatiquement:

[ProtoInclude(1, typeof(SomeItemType))]

Sinon, vous pouvez simplement utiliser des noms montage qualifiés, donc:

[ProtoInclude(1,"SomeItemType, SomeRandomAssembly")]

Dans un cas assez particulier impliquant plusieurs AppDomains, je l'ai trouvé, vous pouvez également travailler un peu de magie avec l'événement AppDomain.TypeResolve, mais qui devraient être évitées si possible. J'ai aussi une re-travail complet de la couche de méta-données dans le pipeline, ce qui permet une plus grande flexibilité lors de l'exécution (plutôt que d'avoir à déclarer everthing lors de la compilation, ce qui est à l'origine partie de la douleur au-dessus).

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top