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
은 SLATemplate을 직렬화 할 수 있습니까? –
아니요, 어쨌든 직렬화하고 싶지 않습니다. 나는 그것을 SerializationInfo에 넣지 않을 것이다. – Ivan
나는 이것이 버그가 아님을 확인하기 위해 코드를 수정했다. 내 게시물을 수정했습니다. – Ivan