Comment désérialisez-vous une classe dérivée des données sérialisées? Ou peut-être devrais-je dire, existe-t-il un meilleur moyen de «désérialiser» les données dans les classes dérivées? Par exemple, supposons que vous ayez une classe de base virtuelle pure (B) héritée par trois autres classes, X, Y et Z. De plus, nous avons une méthode, serialize(), qui traduira X: B, Y: B et Z: B en données sérialisées. De cette façon, il peut être zappé sur un socket, un tube nommé, etc. vers un processus distant.Comment désérialisez-vous une classe dérivée des données sérialisées?
Le problème que j'ai, est, comment pouvons-nous créer un objet approprié à partir des données sérialisées?
La seule solution que je peux trouver est d'inclure un identifiant dans les données sérialisées qui indique le type d'objet dérivé final. Lorsque le destinataire analyse d'abord le champ de type dérivé à partir des données sérialisées, puis utilise une instruction switch (ou une sorte de logique de ce type) pour appeler le constructeur approprié.
Par exemple:
B deserialize(serial_data)
{
parse the derived type from the serial_data
switch (derived type)
case X
return X(serial_data)
case Y
return Y(serial_data)
case Z
return Z(serial_data)
}
donc après avoir appris le type d'objet dérivé nous invoquons le constructeur de type dérivé de approprié.
Cependant, cela semble gênant et lourd. J'espère qu'il y a une façon plus éloquente de le faire. Y a-t-il?
sérialisation Compact (bit à bit) peut mordre à droite dans le cul, surtout si vous voulez sauvegarder les choses dans les fichiers. Au fil des années et des changements de classes, vous êtes à peu près foutu quand vous essayez de les charger à nouveau. Pour cette raison, faire des fichiers auto-documentés et versionnés est une bonne idée. Seulement si le client et le serveur sont en accord à tout moment sur le protocole utilisé, est-il correct d'envoyer des octets directs. Si non, alors j'utiliserais 'XML/JSON'. Cependant, je voudrais aussi regarder dans des choses qui peuvent rendre cela plus facile, comme «SOAP», etc –
@Hamish +1, en faire une réponse! –