2012-07-24 2 views
0

serialization이 처음이므로 가장 확실한 것을 놓치고 있습니다.파생 데이터 집합의 컬렉션을 serialize하는 방법

DataSet 클래스에서 파생 된 개체 컬렉션 인 4 차원 데이터 구조 인 ResultsCollection 클래스가 있습니다. 수정 된 각 DataSet에는 DataTable에서 파생 된 개체 모음이 들어 있습니다. 코드의 관련 비트는 여기 도시 된 바와 같이 I는 공용 직렬화 생성자 공개 GetObjectData 기능을 포함하여를 ISerializable 인터페이스를 구현

[Serializable] 
public class ResultsCollection : CollectionBase, ISerializable 
{ 
    // indexer 
    public MyDataSet this[int index] { get { return (MyDataSet)List[index]; } } 
} 
[Serializable] 
public class MyDataSet : DataSet, ISerializable 
{ 
    // member variable that *overrides* the Tables property of the standard DataSet class 
    public new TablesCollection Tables; 
} 
[Serializable] 
public class TablesCollection : CollectionBase, ISerializable 
{ 
    // indexer 
    public MyDataTable this[int index] { get { return (MyDataTable)List[index]; } } 
} 
[Serializable] 
public class MyDataTable : DataTable, ISerializable 
{ 
    ... 
} 

:

// ResultsCollection -- serialize all variables and also the inner list itself 
public ResultsCollection(SerializationInfo info, StreamingContext ctxt) : base() 
{ 
    _memberVariable = (bool)info.GetValue("_memberVariable", typeof(bool)); 
    ArrayList innerList = (ArrayList)info.GetValue("List", typeof(ArrayList)); 
    InnerList.AddRange(innerList); 
} 
public void GetObjectData(SerializationInfo info, StreamingContext ctxt) 
{ 
    info.AddValue("_memberVariable", _memberVariable); 
    info.AddValue("List", InnerList); 
} 

// MyDataSet -- call standard base-class (DataSet) serialization functions in addition to serializing members 
public MyDataSet(SerializationInfo info, StreamingContext ctxt) : base(info, ctxt) 
{ 
    _memberVariable = (bool)info.GetValue("_memberVariable", typeof(bool)); 
    Tables = (TablesCollection)info.GetValue("Tables", typeof(TablesCollection)); 
} 
public void GetObjectData(SerializationInfo info, StreamingContext ctxt) 
{ 
    base.GetObjectData(info, ctxt); 
    info.AddValue("_memberVariable", _memberVariable); 
    info.AddValue("Tables", Tables); 
} 

// TablesCollection -- serialize all variables and also the inner list itself 
public TablesCollection(SerializationInfo info, StreamingContext ctxt) : base() 
{ 
    _memberVariable = (bool)info.GetValue("_memberVariable", typeof(bool)); 
    ArrayList innerList = (ArrayList)info.GetValue("List", typeof(ArrayList)); 
    InnerList.AddRange(innerList); 
} 
public void GetObjectData(SerializationInfo info, StreamingContext ctxt) 
{ 
    info.AddValue("_memberVariable", _memberVariable); 
    info.AddValue("List", InnerList); 
} 

// MyDataTable -- call standard base-class (DataTable) serialization functions in addition to serializing members 
public MyDataSet(SerializationInfo info, StreamingContext ctxt) : base(info, ctxt) 
{ 
    _memberVariable = (bool)info.GetValue("_memberVariable", typeof(bool)); 
} 
public void GetObjectData(SerializationInfo info, StreamingContext ctxt) 
{ 
    base.GetObjectData(info, ctxt); 
    info.AddValue("_memberVariable", _memberVariable); 
} 

제가 단일 ResultsCollection 개체가 그 ViewState에 저장하여 다음 포스트 백에서 검색합니다 (그러므로이 모든 문제). 초기 요청의 경우, 작동하는 것처럼 보입니다. Serialization 함수에 break-point를 설정 했으므로 데이터 멤버가 실제로 serialize됩니다. 그러나 deserialization 할 때 멤버 변수는 제대로로드되지만 List 개체는 null 멤버로 가득 차 있습니다. 내 코드는 ResultCollection의 첫 번째 MyDataSet 객체에서 DataSetName 속성을 검색하려고 할 때 충돌합니다.

+1

, 당신은 http://code.google로 볼 수도 있습니다 : 따라서 내가 무엇을 할 필요 것은 즉, 두 CollectionBase에 파생 클래스에서를 ISerializable 정의를 제거 이었다 .com/p/protobuf-net /. 필자는 [Serialization] 속성보다 사용하기가 쉽다는 것을 알았습니다. – Liron

+0

'[Serializable]'만 사용하는 것이 훨씬 쉽다고 생각합니다. 모든 클래스가 직렬화 된 클래스와 관계가 있는지 확인해야합니다'[Serializable]'너무 표시됩니다. –

+0

개인적으로 필자는 바이너리에 XML 직렬화를 선호합니다. 사용하기가 훨씬 쉬워졌고 나중에 원시 데이터를 볼 수있게되면 뭔가 잘못되었을 때 알 수 있습니다. 그것은 말하기를, 나는 잘못된 길을 갈 때가 있다는 것을 인정한다. 나는 아직도 좋아하지만 D = – Nevyn

답변

0

CollectionBase의 InnerList 속성이 읽기 전용이므로 인 경우 CollectionBase와 ISerializable이 호환되지 않습니다. 직렬화를 처음 사용하는 경우

[Serializable] 
public class ResultsCollection : CollectionBase 
{ 
    // indexer 
    public MyDataSet this[int index] { get { return (MyDataSet)List[index]; } } 
} 
[Serializable] 
public class MyDataSet : DataSet, ISerializable 
{ 
    // member variable that *overrides* the Tables property of the standard DataSet class 
    public new TablesCollection Tables; 
} 
[Serializable] 
public class TablesCollection : CollectionBase 
{ 
    // indexer 
    public MyDataTable this[int index] { get { return (MyDataTable)List[index]; } } 
} 
[Serializable] 
public class MyDataTable : DataTable, ISerializable 
{ 
    ... 
} 
관련 문제