Pregunta

Nuestra tarea es bastante simple, tenemos un gráfico de objetos donde cada objeto (IDITEM) tiene una identificación única. El gráfico de objetos existe dos veces, en el cliente y en la máquina del servidor.

Ahora pasamos algunos comandos serializables al servidor.El comando tiene como campos algunos de los iditems.Los iditems implementan la interfaz iserializable y solo almacenan su identificación en el SerializationInFO.Como:

// 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());
}

El problema es que, ¿cómo podemos asignar el objeto existente a la instancia que crea el Desernializador?Obviamente, algo como lo siguiente en el constructor iserializable no funciona, porque el identificador 'Este' solo se lee:

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

¿Alguna idea de cómo podemos asignar un objeto existente al objeto deserializado?

Saludos cordiales, Thalm

¿Fue útil?

Solución

que podría poder hacerlo creando un objeto proxy que implementa IObjectReference y realiza la deserialización falsa.

(su objeto proxy tendría que existir tanto en el cliente como en el servidor, y supongo que su versión de usuario, etc. también tendría que ser exactamente iguales en ambos.)

[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!");
    }
}

Otros consejos

No puedes hacerlo directamente así.

En lugar de serializar el objeto completo, pero solo incluido un campo, ¿por qué no solo enviar la identificación y hacer una búsqueda en el cliente y / o servidor?Si entiendo correctamente, ya existe una instancia de ese objeto en el servidor.No debe haber ninguna razón por la que necesites pasar por encima de una versión despojada de ese objeto solo para buscar el mismo objeto nuevamente.

Si la identificación es única y se almacena en una colección en algún lugar junto con el objeto, tener la identificación pasada como una cadena, o cualquier tipo de datos que sea, debe ser suficiente para realizar una búsqueda en su colección de objetos existente.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top