ISerializable:Atribuir um objeto existente na desserialização
-
13-09-2020 - |
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
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.