2016-10-31 7 views
2

私はシリアル化に大きな問題があります。 問題点はわかりませんが、クラスのすべての要素を表示できます。シリアル化のためのC#ヘルプ

ノードでグラフを作成しました。 しかし、唯一の問題です。

私は実装のためのインターフェイスを使用して、接続のタイプの要素を作成しました。 例ブール値Iが

[Serializable] 
     public class Node : IElement 
     { 
      //More Constructor.. 
      public IEnumerable<NodeConnection> Connections { get { return connections; } } 

     public IEnumerable<NodeItem>  Items  { get { return nodeItems; } } 

     public ElementType ElementType { get { return ElementType.Node; } } 


     } 

のElementTypeは、ノードとインタフェース

ある有しBOOLと接続等

ができる:私はこのエラーを有するシリアライズでIElement

public interface IElement 
    { 
     ElementType ElementType { get; } 
    } 

BinaryFormatter bin = new BinaryFormatter(); 
       FileStream fs = new FileStream(sv.FileName, FileMode.Create, FileAccess.ReadWrite); 

bin.Serialize(fs,graph.graphNode); //Error here 

アセンブリ 'グラフ、バージョン= 1.0.0.0、カルチャ=ニュートラル、PublicKeyToken = null'の '例'はシリアル化可能とマークされていません。

逐次化メソッドのgraph.graphNodeはシンプルなリストです 誰もがアイデアを持っていますか?

+0

エラーがタイプ「例」を言及し、私たちにそれを示し、および/またはそれを確認してください。 '[Serializable]'属性を持っています。 –

+0

例題タイプは市場がシリアライズ可能ではありません。サンプルクラスはありますか?そのクラスのコンテンツを表示できますか?市場はシリアライズ可能ですか? –

+0

はい、シリアル化可能とマークされています。私の例のシリアライゼーションコードを見てください 'bin.Serialize(fs、graph.graphNode);'リストはこれです 'publicリスト graphNodes = new List ();'クラスはserializzableとマークされていますlookup Node:IElement –

答えて

2

フォームがclass Example {}と呼ばれる場合は、ノードまたはNodeItemに1つ以上のイベントハンドラが関連付けられている可能性があります。たとえばNodeおよび/またはNodeItemがINotifyPropertyChangedを実装し、フォーム(Exampleクラス)がPropertyChangedにバインドされている場合、bin.Serialize()はフォーム全体をシリアル化しようとします。

解決方法:あなたがそれらをシリアル化する修復されていないクラスによって消費される場合、シリアル化したいクラス内のすべてのあなたのイベントに

[field: NonSerialized] 

:たとえば

[field: NonSerialized] 
public event PropertyChangedEventHandler PropertyChanged; 
は、より正確には:

public class Example : Form 
    { 
    Node _node; 

    public Example() 
    { 
     _node = new Node(); 
     _node.MyEvent += _node_MyEvent; // This will cause the BinaryFormatter to try to serialize Example form when serializing _node - unless [field: NonSerialized] attribute is used. 
    } 

    private void _node_MyEvent(object sender, EventArgs e) 
    { 

    } 
    } 

    [Serializable] 
    public class Node 
    { 
    [field: NonSerialized] 
    public event EventHandler MyEvent; 
    } 

EDIT

同じ非シリアライズオブジェクト直列化可能クラス参照の場合はtrueです:

[Serializable] 
class Connection 
{ 
    // Use [NonSerialized] attribute to prevent serialization of this reference: 
    [NonSerialized] 
    public Example; // A reference to a non serialized object 
} 
+0

タンクヘンリック、1つの問題が終了しました。今、私はConnectionをシリアル化できません。このスクリーンショット(https://cdn.discordapp.com/attachments/207183378447990784/241150291414614016/unknown.png)を見てください。これは私のグラフコントロールです。私はノードを接続していない場合、それを動作させます、それ以外の場合は、すべてのノードを接続すると同じエラーが発生しますが、小さな変更があります 'GraphNodes.ExampleForm'は 'GraphNodes.ExampleForm' Assembly 'GraphNodes、Version = 1.0.0.0、Culture = neutral 、PublicKeyToken = null 'はシリアル化可能とマークされていません。 –

+0

@JoeMartiniello:私はあなたのscreendumpを見ることでそれを得ていませんでした。しかし、私の推測では、ExampleFormへの接続で参照がある可能性があります。上記の私の編集を参照してください。 –

+1

タンクヘンリック本当にタンクは素晴らしいです!!!! 問題が解決しました。本当にタンク! –