Pergunta

a nossa tarefa é bastante simples, temos um gráfico de objeto, onde cada objeto (IDItem) tem um ID único.O gráfico do objeto existe duas vezes no cliente e no computador servidor.

Agora vamos passar algumas serializable comandos para o servidor.O comando tem como campos de alguns dos IDItems.O IDItems implementar a interface ISerializable e armazenar apenas seu ID no 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());
}

O problema é que, como podemos atribuir o objeto existente para a instância que deserializador cria?Obviamente, algo como o seguinte no ISerializable construtor não funciona, porque o 'isto' identificador é só de leitura:

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

Então, alguma idéia de como podemos Atribuir um objeto existente para a anular a serialização de objeto?

Melhores Cumprimentos, thalm

Foi útil?

Solução

Você pode ser capaz de fazê-lo através da criação de um objecto de proxy que implementa IObjectReference e executa o falso desserialização.

(Seu objecto de proxy precisaria existir em ambos, cliente e servidor, e eu suponho que o seu tipo de controle de versão, etc também precisa ser exatamente o mesmo em 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!");
    }
}

Outras dicas

Você não pode fazê-lo diretamente assim.

Em vez de serializar o objeto como um todo, mas apenas incluindo um campo, por que não basta enviar através do ID e fazer uma pesquisa sobre o cliente e/ou servidor?Se eu entendi corretamente, um exemplo de que o objeto já existe no servidor.Não deve haver nenhuma razão por que você precisa passar mais de uma despojado versão de que o objeto em apenas olhar o mesmo objeto novamente.

Se o ID é único e armazenados em uma coleção em algum lugar junto com o objeto, tendo o ID passado como uma seqüência de caracteres, ou qualquer que seja o tipo de dados é, deve ser suficiente para executar uma pesquisa em seu conjunto já existente de objetos.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top