2011-12-24 9 views
16

をシリアル化するときのように、シリアライズエラーがマークされていない:私はこのコードを使用して<code>BinaryFormatter</code>を使用して構造をシリアル化していたクラス

objectToSerializeは私の構造体である
private void SerializeObject(string filename, SerializableStructure objectToSerialize) 
{ 
    Stream stream = File.Open(filename, FileMode.Create); 
    BinaryFormatter bFormatter = new BinaryFormatter(); 
    bFormatter.Serialize(stream, objectToSerialize); 
    stream.Close(); 
} 

、私はこのように、この関数を呼び出しています:

SerializableStructure s = new SerializableStructure(); 
s.NN = NN; 
s.SubNNs = SubNNs; 
s.inputs = inputs; 
SerializeObject(Application.StartupPath + "\\Save\\" + txtSave.Text + ".bin", s); 

どれがSerializableStructureであり、タイプがNN,SubNNsであり、入力がシリアライズ可能です。 (入力には、PointsRectanglesおよび一般リストが含まれています)。私は私のコードを実行すると

は今、私はこのエラーを与えています:

Type 'MainProject.Main' in Assembly 'MainProject, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null' is not marked as serializable.

私はこのエラーを与えてるのはなぜ? Mainは私のフォームであり、これらの変数は私のフォームにあります。

のタイプをMemoryStreamとVB.NETで正常にシリアライズしましたが、なぜこのエラーが発生するのかわかりません。ここで

は私の構造体の定義は次のとおりです。

SerializableStructure:

[Serializable()] 
public class SerializableStructure 
{ 
    public List<Inputs> inputs = new List<Inputs>(); 
    public NeuralNetwork NN; 
    public NeuralNetwork[] SubNNs; 
} 

入力:

[Serializable()] 
public class Inputs 
{ 
    public string XPath { get; set; } 
    public string YPath { get; set; } 
    public string ImagePath { get; set; } 
    public string CharName { get; set; } 
    public string CharBaseName { get; set; } 
    public List<double> x { get; set; } 
    public List<double> y { get; set; } 
    public List<double> DotsX { get; set; } 
    public List<double> DotsY { get; set; } 
    public List<Point> GravityCenters { get; set; } 
    public List<Rectangle> Bounds { get; set; } 

    public override string ToString() 
    { 
     return CharName; 
    } 

    public Inputs(string xPath, string yPath, string imagePath, string charName, string charBaseName) 
    { 
     XPath = xPath; 
     YPath = yPath; 
     ImagePath = imagePath; 
     CharName = charName; 
     CharBaseName = charBaseName; 
     x = new List<double>(); 
     y = new List<double>(); 
     GravityCenters = new List<Point>(); 
     Bounds = new List<Rectangle>(); 
    } 
} 

またNN非常に大きな構造体です(!)。

+0

シリアル化している構造の定義を教えてください。私はSubNN、NN、入力のタイプに興味があります。 – dasblinkenlight

+0

@dasblinkenlight質問を更新しました。 –

+0

NeuralNetworkに代理人はいますか? – dasblinkenlight

答えて

14

これはほとんどの場合、オブジェクトモデルのどこかにシリアル化しようとしているイベント(または他の代理人 - 多分コールバック)があることを意味します。任意のイベントバッキングフィールドに[NonSerialized]を追加します。あなたは、フィールドのようなイベント(最も可能性が高いようなもの)を使用している場合、これは次のとおりです。

また
[field:NonSerialized] 
public event SomeDelegateType SomeEventName; 

:他のほとんどのシリアライザは、イベント/代表者を見て、より良いバージョンの互換性を提供していません。 XmlSerializer、JavaScriptSerializer、DataContractSerializer、またはprotobuf-net(4つの例)に切り替えると、これをやろうとしない簡単な方法で解決できます(イベントはDTOの一部と見なされることはほとんどありません)。

+0

VB.NET言語でNNクラスを使用すると、VB.NETでイベントをNonSerializedに設定するにはどうすればよいですか? –

+0

@Mahdiこのように:http://stackoverflow.com/questions/4377806/vb-net-event-declaration-adding-nonserialized-attribution –

3

問題は、フォームから派生したクラスをシリアル化しようとしていることです。 Formクラスは基本的には直列化できません。ランタイムに依存する膨大な量の内部状態があります。これはHandleのような明白なプロパティから始まります。これは常に異なる値です。あまり明白でないのはSizeのようなプロパティで、ウィンドウのキャプションのフォントのサイズなどのユーザー設定に依存します。コントロールのすべてのテキスト、位置、サイズで終わり、ローカリゼーションの対象となります。フォームの正確なクローンを作成するために、シリアライズされたFormオブジェクトを任意の場所で適切に非直列化することができる確率はゼロです。

マイクロソフトでは、コードを記述するときに骨格を作っていませんでした。クラス宣言から[Serializable]属性を省略しました。だからこそあなたは例外を受け取ります。

あなたは自分のクラスを作成してフォームの状態を取得する必要があります。それに属性を与えます。フォームとコントロールのプロパティをそのクラスのオブジェクトに対して前後にマッピングするコードを書く必要があります。

+0

質問の私の解釈は、含まれているフォームが予期せぬ驚きでした –

+0

フェアコール、私たちはSerializableStructureの定義を見ることができることを望みます。 OPはそれが重要であることを祈ってください:) –

+0

@Marc - 私は1つのことについて不思議です、あなたは誰かがこの質問に答えを投稿したことをどのように知っていましたか?事故、道具、または絶え間なく追跡していますか? –

関連する問題