2012-06-12 6 views
0

데이터 수집 목록을 serialize 할 수 있습니까?DataContracts 목록 직렬화/역 직렬화

[DataContract] 
class ItemList<T> 
{ 
    public ItemList() 
    { 
     items=new List<T>(); 
    } 

    [DataMember] 
    public List<T> items;  
} 

내가 나를의 3 개 버전 사이 버전을 사용하자 어떤 속성 [이름 = "구성"]로 3 clases 구성, Config_V1, Config_V2이 :이 같은 목록의 datacontract, 뭔가를 만들었습니다 구성 클래스. 그래서이 구성 clases의 ItemList 사이에 직렬화 및 deserialize하고 싶습니다. 내가 좋아하는 뭔가를 시도 :

ItemList<ConfigData_V1> l = new ItemList<ConfigData_V1>(); 
l.items.Add(config); 
WriteObject<ItemList<ConfigData_V1>>("serialization.bin", l); 
ItemList<ConfigData_V2> l2; 
l2=ReadObject<ItemList<ConfigData_V2>>("serialization.bin"); 

을하지만 ConfigData_V2의 목록을 기대하고 있지만 ConfigData_V1의 목록을 발견 말한다 ReadObj와 직렬화 복원하면 오류가 발생합니다. 이 충돌을 해결하기 위해 ConfigData 클래스의 버전 관리를 사용하지 않을까요?

+0

나는 그것이 직렬화 생각이있다 문제가되는 강력한 형식의'List '자체 (구성원이 아님). 절름발이 인 채 untyped'List'를 시도해보십시오. – bluevector

+0

@jonnyGold 당신이 옳지 않습니다. 목록 은 serializeble입니다 (IEnumereble 아님). 다른 곳에서 발행하십시오. – RredCat

+0

@RrefCat 직렬화 가능하지 않다는 말은하지 않았습니다. 'List '이 직렬화되었고'List '로 그것을 deserialize하려고 시도하고있다. 그것들은 같은'Type'이 아니기 때문에 작동하지 않을 것입니다. 그는 그것을 형별없는 것으로해야만한다. – bluevector

답변

2

개체를 역 직렬화하면 데이터가 List의 일부이고 b- 포함 개체가 Contract1 인 메타 데이터가 추가됩니다.

작성된 실제 XML을 보면 노드에 표시됩니다. 그 결과

, 당신이 List<Contract2>에 읽기를 수행 할 때 당신이 포함 된 데이터가 Contract1했지만, 당신이 Contract2을 읽으려고 그 말 때문에 모델의 정의를 휴식.

는 속성 당신이 정말 계약의 전체 개념을 파괴하지만 Contract2이 Contract1 알려진 유형인지 상태 경우 잠재적으로 당신을 도울 수 [KnownType(Type)] ......

+0

예, 그렇습니다. 계약 개념을 어기는 것입니다. 이 작업을 수행하는 다른 방법을 알고 있습니까? – Notbad

+1

당신이하고자하는 일에 달려 있습니다. 데이터를 serialize 한 다음 새로운 계약 버전으로 deserialize하는 정상적인 상황을 생각할 수 없습니다. 그럴 수 없다면 - 하나의 버전에서 데이터를 유지 한 다음 직렬화 된 데이터를 저장하지 않고 애플리케이션을 업데이트했습니다. 어질러 놓은. 아주 지저분 해. 그럴 경우 Contract1을 비 직렬화 한 다음 Contract2를 serialize하는 Q & D를 작성합니다. –

+0

죄송합니다 .... 죄송합니다. Q & D는 Quick And Dirty의 약어입니다. :) –