2012-02-08 3 views
3

좋아요, 어떻게 작동하는지 또는 가능하면 약간 퍼지기 마련입니다. Child 클래스를 직렬화하고 싶지만 실제로 Child.MyParent 필드를 수행 할 때 부모 개체를 serialize하지 않으려는 경우 ... 참조를 serialize하기를 원합니다. 이게 가능한가, 어떻게하면 될까?직렬화 할 때 객체 참조를 유지하는 방법

public class Parent 
{ 
    public Child New() 
    { 
     return new Child(this); 
    } 
} 

public class Child 
{ 
    public Parent MyParent; 

    public Child(Parent parent) 
    { 
     MyParent = parent; 
    } 
} 

편집 : DataContractSerializer를 사용하고 있지만 필요한 경우 다른 것으로 전환하는 것에 반대하지 않습니다.

+0

아이가 MyParent를 표시 할 수 있습니다입니다; 그것은 직렬화되지 않도록하지만, 단지 참조가 직렬화되기를 원합니다. 당신이 원하는 것을 정확히 설명해 주시겠습니까? 객체가 직렬화되고 직렬화 된 참조가 실제로 의미를 갖지 않을 때. – seand

+0

@seand 일부 객체를 복제 할 수 있도록 직렬화를 활용하려고합니다. 기본적으로 직렬화 된 다음 즉시 deserialize됩니다. 나는 거기에 ICloneable 인터페이스가 있다는 것을 알았지 만,이 인터페이스를 구현하지 않고도 다양한 유형의 작업을 수행 할 수 있다고 생각합니다. –

+0

이 필드를 serialize하지 않고 직렬화 프로세스 외부에서 관리하는 것이 더 좋을 수도 있다고 생각하지만 가능하다면 어떻게하는지 알고 싶습니다. –

답변

3

XMLIgnoreAttribute은 직렬화하려는 필드에 적용 할 수 있습니다. 당신이 참조 점에 개체를 지속 할 계획 방법 예를 들어,

public class Child 
{ 
    [XmlIgnore] 
    public Parent MyParent; 

    public Child(Parent parent) 
    { 
     MyParent = parent; 
    } 
} 

는 그러나 지금까지 현장에 대한 참조를 직렬화와 같은, 당신은 더 많은 정보를 제공해야 할 것이다. Parent 회원 (귀하의 경우)을 연대시키지 않는 이유는 무엇입니까? 필요한 모든 공용 멤버를 직렬화하는 것이 일반적입니다.

그냥 복제 직렬화를 사용하려면

,이 같은 작동합니다 : 당신이 당신의 자신의 직렬화 및 역 직렬화 기능을 구현해야 할 수도 있습니다처럼

private static Parent Clone(Parent parent) 
{ 
    Parent parentClone = null; 
    lock (m_lock) // serialize cloning. 
    { 
     IFormatter formatter = new BinaryFormatter(); 
     MemoryStream stream = new MemoryStream(); 
     using (stream) 
     { 
      formatter.Serialize(stream, parent); 
      stream.Seek(0, SeekOrigin.Begin); 
      parentClone = (Parent)formatter.Deserialize(stream); 
     } 
    } 

    return parentClone; 
} 
+0

저는 객체를 복제하기 위해 직렬화를 활용하려고합니다. 따라서 객체는 byte [] 변수로 직렬화 된 다음 즉시 새 객체로 deserialize됩니다. 부모 객체는 직렬화되지 않습니다. 직렬화 프로세스 후에 Parent 속성을 다시 설정하는 방법을 찾는 것이 더 나은 방법이라고 생각합니다. –

+0

@BrandonMoore - 이렇게하려면 [IDeserializationCallback] (http://msdn.microsoft.com/en-us/library/system.runtime.serialization.ideserializationcallback.aspx)을 사용할 수 있습니다. –

+0

오, 내가 자식을 복제하려고하는데 부모가 아니라 ... 당신의 예가 다른 방향으로하고있는 것처럼 보입니다. 어쨌든 나는 IDeserializationCallback이 이것을 처리 할 유일한 유일한 방법이 될 것이라고 동의합니다. –

0

는 소리. 여기

http://msdn.microsoft.com/en-us/library/system.runtime.serialization.iserializable.getobjectdata.aspx

는 일시적으로 인 MSDN

에서 추출
[Serializable] 
    public class Person : ISerializable 
    { 
     private string name_value; 
     private int ID_value; 

     public Person() { } 
     protected Person(SerializationInfo info, StreamingContext context) 
     { 
      if (info == null) 
       throw new System.ArgumentNullException("info"); 
      name_value = (string)info.GetValue("AltName", typeof(string)); 
      ID_value = (int)info.GetValue("AltID", typeof(int)); 
     } 

     [SecurityPermission(SecurityAction.LinkDemand,Flags = SecurityPermissionFlag.SerializationFormatter)] 
     public virtual void GetObjectData(SerializationInfo info, StreamingContext context) 
     { 
      if (info == null) 
       throw new System.ArgumentNullException("info"); 
      info.AddValue("AltName", "XXX"); 
      info.AddValue("AltID", 9999); 
     } 

     public string Name 
     { 
      get { return name_value; } 
      set { name_value = value; } 
     } 

     public int IdNumber 
     { 
      get { return ID_value; } 
      set { ID_value = value; } 
     } 
    } 
관련 문제