2010-11-27 6 views
1

C#에서 개체를 deserialize하려고 할 때 다음과 같은 오류가 발생합니다."호출 대상에 의해 예외가 발생했습니다." 개체를 deserialize하려고 할 때

호출 대상에 의해 예외가 발생했습니다.

코드의 관련 부분 :

[Serializable()] 
    public struct SlaAttribute : ISerializable 
    { 
     static int nextId = 1; 

     public int id; 
     public string parameterName; 
     public string parameterNameInInitialTemplate; 
     public string unit; 

     public SlaAttribute(SerializationInfo info, StreamingContext ctxt) 
     { 
      this.id = (int)info.GetValue("id", typeof(int)); 
      this.parameterName = (string)info.GetValue("parameterName", typeof(string)); 
      this.parameterNameInInitialTemplate = (string)info.GetValue("parameterNameInInitialTemplate", typeof(string)); 
      this.unit = (string)info.GetValue("unit", typeof(string)); 
     } 

     public void GetObjectData(SerializationInfo info, StreamingContext ctxt) 
     { 
      info.AddValue("id", typeof(int)); 
      info.AddValue("parameterName", typeof(string)); 
      info.AddValue("parameterNameInInitialTemplate", typeof(string)); 
      info.AddValue("unit", typeof(string)); 
     } 
    } 



[Serializable()] 
class ConsumerSerialized : ISerializable 
{ 
    string requirement; 
    string dialect; 
    int initialId; 
    int id; 
    int iteration; 
    List<VieSLAF.WSLA.CaseStudy.Client.Console.Consumer.SlaAttribute> attributes; 

    public ConsumerSerialized(SerializationInfo info, StreamingContext ctxt) 
    { 
     this.requirement = (string)info.GetValue("requirement", typeof(string)); 
     this.dialect = (string)info.GetValue("dialect", typeof(string)); 
     this.initialId = (int)info.GetValue("initialId", typeof(int)); 
     this.id = (int)info.GetValue("id", typeof(int)); 
     this.iteration = (int)info.GetValue("iteration", typeof(int)); 
     this.attributes = (List<VieSLAF.WSLA.CaseStudy.Client.Console.Consumer.SlaAttribute>)info.GetValue("attributes", typeof(List<VieSLAF.WSLA.CaseStudy.Client.Console.Consumer.SlaAttribute>)); 
    } 

    public ConsumerSerialized(Consumer consumer) 
    { 
     this.requirement = consumer.requirement; 
     this.dialect = consumer.dialect; 
     this.initialId = consumer.initialId; 
     this.id = consumer.id; 
     this.iteration = consumer.iteration; 
     this.attributes = consumer.attributes; 
    } 

    public void GetObjectData(SerializationInfo info, StreamingContext ctxt) 
    { 
     info.AddValue("requirement", typeof(string)); 
     info.AddValue("dialect", typeof(string)); 
     info.AddValue("initialId", typeof(int)); 
     info.AddValue("id", typeof(int)); 
     info.AddValue("iteration", typeof(int)); 
     info.AddValue("attributes", typeof(List<VieSLAF.WSLA.CaseStudy.Client.Console.Consumer.SlaAttribute>)); 
    } 

    public Consumer Convert() 
    { 
     return new Consumer(requirement, dialect, initialId, id, iteration, attributes); 
    } 
} 

[Serializable()] 
class ListOfConsumers : ISerializable 
{ 
    List<ConsumerSerialized> consumers = null; 

    public List<ConsumerSerialized> Consumers 
    { 
     get { return consumers; } 
     set { consumers = value; } 
    } 

    public ListOfConsumers(List<ConsumerSerialized> consumers) 
    { 
     this.consumers = consumers; 
    } 

    public ListOfConsumers(SerializationInfo info, StreamingContext ctxt) 
    { 
     this.consumers = (List<ConsumerSerialized>)info.GetValue("Consumers", typeof(List<ConsumerSerialized>)); 
    } 

    public void GetObjectData(SerializationInfo info, StreamingContext ctxt) 
    { 
     info.AddValue("Consumers", this.consumers); 
    } 
} 

class ConsumersSerializer 
{ 
    List<ConsumerSerialized> ConvertConsumers(List<Consumer> consumers) 
    { 
     List<ConsumerSerialized> result = new List<ConsumerSerialized>(); 
     foreach (Consumer c in consumers) 
      result.Add(new ConsumerSerialized(c)); 

     return result; 
    } 

    List<Consumer> ConvertConsumers(List<ConsumerSerialized> consumers) 
    { 
     List<Consumer> result = new List<Consumer>(); 
     foreach (ConsumerSerialized c in consumers) 
      result.Add(c.Convert()); 

     return result; 
    } 

    public void SerializeObject(List<Consumer> listOfConsumers) 
    { 
     ListOfConsumers consumers = new ListOfConsumers(ConvertConsumers(listOfConsumers)); 
     Stream stream = File.Open(Settings.FilePathSerializator, FileMode.Create); 
     BinaryFormatter bFormatter = new BinaryFormatter(); 
     bFormatter.Serialize(stream, consumers); 
     stream.Close(); 
    } 

    public List<Consumer> DeSerializeObject() 
    { 
     try 
     { 
      Stream stream = File.Open(Settings.FilePathSerializator, FileMode.Open); 
      BinaryFormatter bFormatter = new BinaryFormatter(); 
      ListOfConsumers consumers = (ListOfConsumers)bFormatter.Deserialize(stream); 
      stream.Close(); 
      return ConvertConsumers(consumers.Consumers); 
     } 
     catch (Exception ex) 
     { 
      System.Console.WriteLine(ex.Message); 
      throw ex; 
     } 
    } 
} 

내가 이런 식으로 직렬화를하고 있어요 :

List<Consumer> initialConsumers = ... 
ConsumersSerializer cs = new ConsumersSerializer(); 
cs.SerializeObject(initialConsumers); 

그리고 직렬화 복원이 방법 :

ConsumersSerializer cs = new ConsumersSerializer(); 
List<Consumer> initialConsumers = cs.DeSerializeObject(); 

하나를 생각?

감사합니다. Ivan

+0

은 SLATemplate을 직렬화 할 수 있습니까? –

+0

아니요, 어쨌든 직렬화하고 싶지 않습니다. 나는 그것을 SerializationInfo에 넣지 않을 것이다. – Ivan

+0

나는 이것이 버그가 아님을 확인하기 위해 코드를 수정했다. 내 게시물을 수정했습니다. – Ivan

답변

13

나는 어리석은 실수를 저질 렀습니다. 대신이의 :

info.AddValue("id", this.id); 

내가이 글을 쓰는되었다

info.AddValue("id", typeof(int)); 

최종 교훈을 - 마시는 동안 프로그래밍을하지 않습니다.

건배.

+6

잔 돌기 돌기 돌기 돌기. – Puppy

+1

+1 유머 감각 정도 :) – George

관련 문제