iserializable : deserialization에 기존 객체를 할당합니다
-
13-09-2020 - |
문제
우리의 작업은 매우 간단합니다. 각 객체 (IDITEM)가 고유 한 ID가있는 객체 그래프가 있습니다. 오브젝트 그래프는 클라이언트 및 서버 시스템에서 두 번 존재합니다.
이제 서버에 직렬화 가능 명령을 전달합니다.이 명령은 필드의 일부 IDITEMS입니다.IDItems는 iSerializable 인터페이스를 구현하고 SerializationInfo에만 해당 ID 만 저장합니다.좋아요 :
// 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());
}
.
문제는 어떻게 탈시 라이저가 생성하는 인스턴스에 기존 개체를 할당 할 수 있습니까?분명히 '이'식별자가 읽기 전용이므로 iSerializable 생성자에서 다음과 같은 것이 작동하지 않습니다.
//does not work
protected IDItem(SerializationInfo info, StreamingContext context)
{
this = GlobalObject.GetIDItem(info.GetString("ID"));
}
.
우리가 기존 객체를 deserialized 객체에 할당 할 수있는 방법은 무엇입니까?
최고의 안부, thalm
해결책
IObjectReference
가짜 deserialization을 수행합니다.
(프록시 객체가 클라이언트와 서버 모두에 있어야하며, 유형 버전 관리 등이 모두 똑같이 있어야합니다.)
[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!");
}
}
. 다른 팁
당신은 그것을 직접 할 수 없습니다.
전체 객체를 직렬화하지만 하나의 필드 만 포함하는 대신 ID를 보내고 클라이언트 및 / 또는 서버에서 조회를 수행하지 않는 이유는 무엇이에요?내가 올바르게 이해하면 해당 객체의 인스턴스가 이미 서버에 존재합니다.동일한 객체를 다시 찾기 위해 해당 객체의 박리 된 버전을 통과 해야하는 이유가 없어야합니다.
ID가 고유 한 경우 객체와 함께 어딘가에있는 컬렉션에 저장된 경우, ID가 문자열로 전달되거나 데이터 유형이있는 데이터 유형은 기존 객체 모음에서 조회를 수행하기에 충분해야합니다.