Question

Notre tâche est assez simple, nous avons un graphique d'objet où chaque objet (IDITEM) a une carte d'identité unique. Le graphique d'objet existe deux fois, sur le client et sur la machine serveur.

Nous passons maintenant des commandes sérialisables sur le serveur.La commande a des champs certains des iditems.Les iditems implémentent l'interface iserializable et ne stockent que leur identifiant dans la sérieIFOIFO.Comme:

// The method called when serializing a IDItem.
void GetObjectData(SerializationInfo info, StreamingContext context)
{
    // Instead of serializing this object, just save the ID
    info.AddValue("ID", this.GetID());
}

Le problème est, comment pouvons-nous attribuer l'objet existant à l'instance que le désérialiseur crée?De toute évidence, quelque chose comme ce qui suit dans le constructeur iserializable ne fonctionne pas, car le "Cet identifiant" est en lecture seule:

//does not work   
protected IDItem(SerializationInfo info, StreamingContext context)
{
    this = GlobalObject.GetIDItem(info.GetString("ID"));
}

Donc toute idée de la manière dont nous pouvons attribuer un objet existant à l'objet désérialisé?

meilleures salutations, THALM

Était-ce utile?

La solution

vous pourrait être capable de le faire en créant un objet proxy qui implémente IObjectReference et effectue la fausse désérialisation.

(votre objet proxy devrait exister sur le client et le serveur, et je suppose que votre type Versioning, etc. aurait également besoin d'être exactement les mêmes sur les deux.)

[Serializable]
public class Example : ISerializable
{
    // ...

    void ISerializable.GetObjectData(
        SerializationInfo info, StreamingContext context)
    {
        info.SetType(typeof(ExampleDeserializationProxy));
        info.AddValue("ID", this.GetID());
    }
}

// ...

[Serializable]
public class ExampleDeserializationProxy : IObjectReference, ISerializable
{
    private readonly int _id;

    private ExampleDeserializationProxy(
        SerializationInfo info, StreamingContext context)
    {
        _id = info.GetInt32("ID");
    }

    object IObjectReference.GetRealObject(StreamingContext context)
    {
        return GlobalObject.GetIDItem(_id);
    }

    void ISerializable.GetObjectData(
        SerializationInfo info, StreamingContext context)
    {
        throw new NotSupportedException("Don't serialize me!");
    }
}

Autres conseils

Vous ne pouvez pas le faire directement comme ça.

au lieu de sérialiser l'objet entier mais n'incluait qu'un seul champ, pourquoi non seulement envoyer l'identifiant et effectuer une recherche sur le client et / ou le serveur?Si je comprends bien, une instance de cet objet existe déjà sur le serveur.Il ne devrait y avoir aucune raison pour laquelle vous auriez besoin de passer sur une version dépouillée de cet objet simplement pour rechercher à nouveau le même objet.

Si l'identifiant est unique et stocké dans une collection quelque part avec l'objet, la saisie d'ID est passée sous forme de chaîne, ou quel que soit le type de type de données, il faut suffire à effectuer une recherche dans votre collection d'objets existants.

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