문제

우리의 작업은 매우 간단합니다. 각 객체 (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가 문자열로 전달되거나 데이터 유형이있는 데이터 유형은 기존 객체 모음에서 조회를 수행하기에 충분해야합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top