2012-03-15 2 views
1

OK, 나는이 같은 클래스가 있다면 ... 직렬화 '이'

[serializable] 
public class MyClass() : ISerializable 
{ 
    public Dictionary<string, object> Values {get; set;} 
} 

은 내가 신속한 답변을 찾으려고 사람들을 위해, 그것은 (답을 직렬화 할 필요가 알고이며, 이) ...

protected MyClass(SerializationInfo info, StreamingContext context) 
{ 
    Values = (Dictionary<string, object>)info.GetValue("values", typeof(Dictionary<string, object>)); 
} 

public void GetObjectData(SerializationInfo info, StreamingContext context) 
{ 
    info.AddValue("values", Values); 
} 

대신 Dictionary에서 상속받은 클래스를 정의하고 싶다면 어떻게해야합니까?

나는 여기까지 ...

[serializable] 
public class MyClass() : Dictionary<string, object>, ISerializable 
{ 
    public void GetObjectData(SerializationInfo info, StreamingContext context) 
    { 
    info.AddValue("me", this); 
    } 
} 

하지만 내가 길을 잃기를 얻을. 나는 이것을 쓸 수 없다 ...

protected MyClass(SerializationInfo info, StreamingContext context) 
{ 
    this = (MyClass)info.GetValue("me", typeof(MyClass)); 
} 

'cos'this is r/o. 그래서, 어떻게 진행하겠습니까? GetObjectData() 구현에 대해서도 맞습니까?

나는 그것이 차이를 만들 것입니다 생각하지 않지만, 이미 ISerializable를 구현하는 것이 않는 경우를 대비, 나는 (this 참조) 닷넷 4.0

+0

왜 'ISerializable'을 구현하고 있습니까? 디폴트 직렬화는 거의 모든 것에 적용되며 지금까지 본 ISerializable 구현 중 90 %는 아직 실현되지 않은 사람들로부터의 것입니다. – Yaur

+0

@Yaur a : 사전과 같은 것을 상속 할 때는 ** 필수 **입니다 (캡슐화가 더 좋은 아이디어라고 주장 하겠지만). 즉, b : 개인적으로 BinaryFormatter를 지나치게 추천하지 않으려 고 노력합니다. –

+0

@Yaur. 그렇지 않은 경우 클래스 인스턴스를 deserialize하려고하면 예외가 발생합니다. 내 수업에서 Dictionary를 사용하고 있다면 ISerializable을 구현해야합니다. –

답변

6

Dictionary<T, V>에서이 쓰고 있어요. 따라서 기본 클래스의 메소드를 호출하십시오.

public class MyClass() : Dictionary<string, object> 
{ 
     protected MyClass(SerializationInfo info, StreamingContext context) 
      : base(info, context) // Call the constructor in Dictionary 
     { 
     // instantiate other properties you had added to MyClass. 
     } 

     public void GetObjectData(SerializationInfo info, StreamingContext context) 
     { 
     base.GetObjectData(info, context); 
     // Now add other fields that MyClass implements. 
     info.AddValue("whatever", this.AnotherProperty); 
     } 
} 
+0

농담이 아닙니다! Bu99er! 나는 단지 내가 충분히 읽지 않았다고 생각한다! 내 자신의 수비에서, 나는이 주제에 대해 어쨌든 내가 읽은 것의 약 25 % 만 이해했다! 고마워. –

관련 문제