0

DataContracts를 통해 사용자 지정 데이터 개체를 serialize하고 복원 할 때 이상한 문제가 있습니다. 다음 클래스에서 문제가 발생합니다.deserialisation 개체 참조가 다른 것 같다

[DataContract] 
public class ProjectManager 
{ 
    // list of projects 
    [DataMember] 
    public List<Project> ProjectList { get; set; } 

    // active project 
    [DataMember] 
    public Project ActiveProject { get; set; } 

    // instance variable 
    [DataMember] 
    private static ProjectManager instance = null; 

ActiveProject는 ProjectList의 한 개체에 대한 참조를 저장합니다. 문제는 하나의 경우에는 ActiveProject에 저장된 참조가 ProjectList의 참조와 같지 않은 것처럼 보이지만 목록에 하나만 존재한다는 것입니다. 내 ActiveProject를 변경하면 ProjectList의 객체가 변경되지 않습니다.

이 문제는 데이터를 deserialising 한 후에 만 ​​발생하며이 오류가 발생하지 않도록하기 위해 수행 할 수있는 작업을 알지 못합니다. 이 동작이 가능합니까? 또는 아직 찾지 못한 코드에 상호 참조가 있어야합니까?

+1

'프로젝트'에서 '같음'을 재정의 할 수 있습니까? –

+1

다른 인스턴스가있는 객체를 비 직렬화하면 '이 동작이 가능한가?'입니다. – I4V

+0

나는 비 직렬화 직후에'ActiveProject'에 대한리스트를 foreach check했다. "true"를 반환 했으므로 오류는 내 코드의 다른 곳에서 발생해야합니다. 젠장 삭제 표시 ... 힌트를위한 thx! – xmashallax

답변

0

일반적으로 deserialization은 동일한 객체를 참조하는 2 개의 객체를 처리하지 않습니다. 대신 각 참조 위치에 새 객체를 만들 수 있습니다.

이진 직렬화/직렬화를 시도하십시오.

그래도 실패하면 고유 한 직렬화를 만들고 개체 참조 목록을 만들 수 있습니다. 이전에 직렬화 된 참조로 객체를 직렬화하자마자 특수 태그를 추가 할 수 있으므로 직렬화 복원 중에 동일한 객체에 대한 참조를 다시 작성할 수 있습니다.

하지만 그건 내 직렬화에 추가 할 다음 계획이므로, 사용자 지정 직렬화를위한 시간이 너무 길어질 수 있습니다. 바라건대 이진 직렬화로 충분하다.

또 다른 해결 방법은 두 번째 참조가 아닌 목록을 사용하고 정수 (올바른 인덱스 번호 참조)를 사용하는 것이다. 또는 이중 참조를 다시 작성하는 데 도움이되는 다른 변수를 작성하십시오.

+0

직렬화 해제는 스트림에서 스트림을 생성하여 객체를 만드는 것을 의미합니다. * reference *는 모든 속성/필드가 동일하더라도 결코 동일하지 않습니다. (심지어 바이너리 직렬화) – I4V

+0

@ I4V 당신이 맞을 때 원본 개체를 deserialized 직렬화 동일한 개체와 비교할 수 있지만 여기에 문제가 직렬화 된 클래스를 동일한 개체에 대한 참조가 여러 개 포함되어 있고 deserialized, 여러 참조 각 개체는 개별 개체를 가리 킵니다. (그래서 직렬화 된 클래스의 변수들 사이에서 객체 참조가 변하게된다.) CA-> D CB-> D .. 일반화 (직렬화 (C)) .. CA-> D CB-> D ' – Amegon

+0

나는 약간의 테스트를했다. 데이터를 deserialize하고 비교했다. 생성 된 객체는 같았습니다. 그래서 한 개체를 변경하고 다시 비교했습니다. 이제 개체가 동일하지 않았습니다. deserialization 후에는 두 개의 고유 한 개별 객체가 있습니다. – xmashallax

1

DataContractSerializer는 보존 된 개체 참조를 지원합니다. preserveObjectReferences 생성자 매개 변수 in this overload을 참조하십시오. serializer를 만드는 방식을 변경해야 할 수도 있습니다.

+0

내가 찾고있는 것처럼 보이지만 초보자를 위해 구현하기가 약간 힘듭니다. – xmashallax

관련 문제