0

Linq2Sqlによって生成されたクラスがあります:

public partial class BuyerOrder : INotifyPropertyChanging, INotifyPropertyChanged

この投稿で行われているように、このクラスのオブジェクトのクローンを作成したいと思います。この目的のために、生成されていないファイルで部分クラスを定義します。これをシリアル化可能としてマークします。

[Serializable]
public partial class BuyerOrder    

しかし、私が呼んでいるとき

formatter.Serialize(stream, source);

このクラスはシリアル化可能としてマークされていないという例外が発生します。私は何が間違っているのですか?

4

2 に答える 2

1

LINQ-to-SQLタイプをシリアル化する場合は、シリアル化可能なデータを出力するようにcode-genに指示します。これは、DBMLで、またはより簡単にデザイナーで行うことができます。シリアル化モードを単方向に設定するだけです(これはDBML@Serializationのルート<Database>要素の属性です)。

This will generate attribute markers suitable for use with DataContractSerializer; LINQ-to-SQL is designed to be serializable with DataContractSerializer. It is not designed to be serializable with BinaryFormatter.

于 2012-08-21T18:40:12.983 に答える
0

BuyerOrder から派生したすべてのクラスは、[Serializable] として装飾する必要があります。また、シリアル化インスタンスが参照を保持するすべてのオブジェクトも (NonSerializable として装飾しない限り) 装飾する必要があります。

例外は、シリアル化可能な属性が欠落している型を示しているはずです。すべてのクラスを装飾できない、または装飾したくない場合は、もう少し創造的になる必要があります。

-- 他の可能性 --

1 つのオプションは、C# オブジェクトの汎用ディープ クローンの実装で説明されている手法を使用することです。これは完全にメモリ内で行うことができ、バイナリ フォーマッタを使用しないため、シリアライゼーション ベースのクローン作成よりも何倍も高速に実行されます。

ソース コードはhttp://csharptest.net/browse/src/Library/Cloningにあります。

次の 2 行のコードのみが必要です。

using (ObjectCloner cloner = new SerializerClone())
    fooCopy = cloner.Clone(foo);
于 2012-08-21T18:40:53.563 に答える