2010-11-28 5 views
5

현재 작업중인 응용 프로그램에서 '프로젝트'에 필요한 모든 데이터가 포함 된 큰 개체 구조를 저장하는 중입니다. 데이터는 사진, 흐름 문서 및 기본적인 데이터 유형과 같은 것들입니다.다른 ISerializable 개체를 포함하는 ISerializable 개체를 serialize

현재, 필자는 현재 저장해야하는 개체 내에 포함 된 모든 클래스에 대해 ISerializable을 구현하고 있습니다. 그러나 언제 :

public class Profile : ISerializable 
{ 
    public ObservableCollection<Trade> Trades { get; set; } 

    public Profile() {} 

    public Profile(SerializationInfo info, StreamingContext context) 
      : this() 
     {  
      foreach (SerializationEntry entry in info) 
      { 
       if (entry.Name.StartsWith("trade")) 
       { 
        Type t = entry.ObjectType; 
        Trades.Add(entry.Value as Trade); 
       } 
      } 
     } 

    public void GetObjectData(SerializationInfo info, StreamingContext context) 
     { 
      int i = 0; 
      foreach (Trade t in Trades) 
      { 
       info.AddValue("trade" + i, t, t.GetType()); 
       i++; 
      } 
     } 
} 

이 발생합니다. 내 목록을 채우는 Trade 클래스도 ISerializable을 구현합니다. 그래서 제가 궁금해하는 것은 이것이 좋은 접근입니까? 그것도 작동합니까? 지금까지 작성한 코드는 작동하지 않으며, 나는 여전히 꼬임 문제를 해결하려고 노력하고 있습니다.

더 구체적으로 info.AddValue ("trade"+ i, t, t.GetType()); Trade 클래스의 ISerializable 메소드를 사용 하시겠습니까? 아니면이 인터페이스는 이러한 유형의 클래스를 처리하기위한 것이 아닙니다.

누군가가 그렇게 친절하고 작은 표정을 지을 때 올바른 방향으로 나를 가리킬 수 있습니다.

감사합니다.

답변

2

Trade 클래스를 게시 할 수 있고 정확하게 작동하지 않는 것에 대한 세부 정보가 도움이된다면 어떤 문제인지 정확히 알 수 없지만 일반적으로 Trade 클래스가 직렬화 가능하다면 [Serializable] 특성을 Profile 클래스에 추가하고 ISerializable을 구현하여 사용자 지정 serialization을 수행 할 필요가 없습니다.

일반적으로 사용자 지정 직렬화 (예 : 데이터 멤버가 직렬화되지 않을 때)를 수행해야 할 때만 ISerializable을 구현하면됩니다.

편집 : ObservableCollection을 사용하고있어서 [Serializable] 특성을 사용한 나의 이전 설명이 올바르지 않다는 것을 깨달았습니다. ObservableCollection을 serialize하는 방법에 대한 정보는 http://kentb.blogspot.com/2007/11/serializing-observablecollection.html이거나 ObservableCollection.CopyTo()를 사용하여 Trade [] 인스턴스를 가져 와서 SerializationInfo에 직접 추가 할 수 있어야합니다.

+0

더 구체적인 질문이 아니며 구체적인 코드 예입니다. 미안하다면 미안해. 질문 : 사용자 지정 직렬화를 수행해야하는 클래스가 있고 해당 클래스에 사용자 지정 직렬화가 필요한 개체가 포함되어있는 경우 GetObjectData 메서드에서이를 처리하려면 어떻게해야합니까? 아니면 그게 문제가 아니겠습니까? 아마도 DataContractSerializer와 같은 요소가 필요하거나 아닌지 궁금 할 것입니다. 감사합니다 – vesz

+0

일반적으로 각 클래스는 자체 직렬화 (사용자 지정 또는 기본값)를 담당해야하며 직렬화 가능 클래스를 포함하는 클래스는이를 수행하는 방법을 알거나 신경 쓰지 않아도되며 캡슐화됩니다. ObservableCollection의 직렬화로 인해 문제가 발생할 수 있습니다. 여기에 대한 자세한 정보는 http://kentb.blogspot.com/2007/11/serializing-observablecollection.html입니다. 형식을 serialize하기 만하면 ObservableCollection.CopyTo()를 사용하여 Trade []를 가져 와서 SerializationInfo에 직접 추가 할 수 있어야합니다. – SpeksETC

+0

감사합니다. 매우 도움이됩니다. 아마도 CopyTo()로 충분할 것입니다. 나는 그것이 가능하다는 것을 몰랐다. 기본 유형 이외의 것이라면 목록의 모든 객체를 개별적으로 직렬화해야한다고 생각했습니다. – vesz

관련 문제