2010-12-02 4 views
7

저는 ISerializable로 직렬화 가능/비 직렬화 가능하게 만든 하위 클래스가있는 사용자 정의 추상 기본 클래스를가집니다. 이 클래스의 하위 클래스의 단일 인스턴스에 대한 직렬화/비 직렬화를 수행하면 모든 것이 잘 동작합니다. 그러나 배열을 만들 때 직렬화에 항상 null 배열이 생깁니다. 직렬화는 BinaryFormatter로 수행됩니다.배열의 비 직렬화는 항상 널 배열을 제공합니다.

항목이 포함되어 있습니다

Trade[] trades = (Trade[])Trades.ToArray<Trade>(); 
      info.AddValue("trades", trades); 

그리고 직렬화 이것에

가에 또한 직렬화 생성자에서 이루어집니다 :이 SerializationInfo에 매개 변수에 GetObjectData에서 이루어집니다 직렬화에

public ObservableCollection<Trade> Trades { get; private set; } 

SerializationInfo 매개 변수 :

Trade[] trades = (Trade[])info.GetValue("trades", typeof(Trade[])); 

      foreach (Trade t in trades) 
      { 
       Trades.Add(t); 
      } 

Des erialization은 항상 나에게 널 (null)의 배열을 제공하고 앞서 언급 한 바와 같이, 하나의 항목은 직렬화이 코드를 잘 deseriaizes :

직렬화 (GetObjectData 방법) :

info.AddValue("trade", Trades.First<Trade>()); 

역 직렬화 (직렬화 생성자) :

Trade t = (Trade)info.GetValue("trade", typeof(Trade)); 
      Trades.Add(t); 

일반적인 문제입니까? 나는 적어도 다른 사람이 그곳에 뛰어 드는 것을 발견하지 못하는 것 같습니다. 다행히도 해결책이 있습니다 :) 그리고 더 많은 정보/코드를 제공해야 할 필요가 있다면 말해주십시오.

감사합니다.

+0

안녕하세요. 정보 변수는 무엇입니까? 직렬화의 형식은 무엇입니까? XML 또는 바이너리? –

+1

GetObjectData 및 Serialization-constructor에서 사용하는 SerializationInfo입니다. 미안합니다. – vesz

+0

http://stackoverflow.com/questions/126155/c-array-xml-serialization 어떤 도움이 필요합니까? – Polity

답변

9

배열이 먼저 비 직렬화됩니다. 그런 다음 모든 내부 비 직렬화가 수행됩니다. 따라서 항목에 액세스하려고하면 null입니다.

어떤 아이디어에서 [OnDeserialized] 속성을 사용하는 아이디어는 다른 모든 속성을 만듭니다. 여기에 예가 나와 있습니다.

[Serializable] 
public class TestClass : ISerializable 
{ 
    private Trade[] _innerList; 
    public ObservableCollection<Trade> List { get; set; } 

    public TestClass() 
    { } 

    [OnDeserialized] 
    private void SetValuesOnDeserialized(StreamingContext context) 
    { 
     this.List = new ObservableCollection<Trade>(_innerList); 
     this._innerList = null; 
    } 

    protected TestClass(SerializationInfo info, StreamingContext context) 
    { 
     var value = info.GetValue("inner", typeof(Trade[])); 
     this._innerList = (Trade[])value; 
    } 

    public void GetObjectData(SerializationInfo info, StreamingContext context) 
    { 
     info.AddValue("inner", this.List.ToArray()); 
    } 
} 
+0

나는 좀더 자세히 살펴보고 더 많은 코드를 제공 할 것입니다. 내 질문에. 실제로 직렬화 할 수있는 개체의 배열이 들어있는 클래스의 serialization을하고 있어요. 하나의 대안은 serializationInfo에서 다른 이름으로 전체 배열을 serialize하는 것입니다. "trade1"등등. – vesz

+0

대답이 업데이트되었습니다.) –

+0

시험 해보기. 잠시만 기다려주세요. 당신은 너무 빠릅니다 :) 나는 새로운 테스트 프로젝트를 마칠조차하지 못했습니다. D – vesz

관련 문제