2012-02-08 17 views
3

これはどのように動作するか、可能であれば少しぼやけています。 Childクラスをシリアル化したいのですが、Child.MyParentフィールドを実行しているときにParentオブジェクトをシリアル化する必要はありません。ただ参照をシリアル化したいだけです。これは可能なのですか?それについてどうすればいいですか?シリアル化するときにオブジェクト参照を維持する方法

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私はシリアル化を利用していくつかのオブジェクトをクローン化しようとしています。基本的には、それらはシリアライズされ、すぐにデシリアライズされます。私はそこにICloneableインターフェイスがあることを認識していますが、このインターフェイスを実装することなく、さまざまな種類のインターフェイスを作成できます。 –

+0

私は、このフィールドをシリアル化してシリアル化プロセス外で管理しないほうが良いかもしれないと考えていますが、可能であれば、どのようにしたらよいか知りたいです。 –

答えて

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 []変数にシリアライズされ、直ちに新しいオブジェクトに逆シリアル化されます。親オブジェクトは決してシリアル化されません。私はより良いアプローチは、シリアル化プロセスの後に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; } 
     } 
    } 
関連する問題