3

MathNET Numerics プロジェクト内で提供されるオブジェクトである DenseMatrix オブジェクトをシリアル化しようとしています。

DenseMatrix.cs

以下に、いくつかの有用な情報を提供しました。

  • オブジェクト エクスプローラーと .NET リフレクターの両方から、このクラス (およびこのクラスが継承するすべてのもの) が [Serializable] としてマークされていることがわかります。

  • Attribute.IsDefined(typeof(MathNet.Numerics.LinearAlgebra.Double.DenseMatrix), typeof(SerializedAttribute)) はtrueを返します。

  • typeof(MathNet.Numerics.LinearAlgebra.Double.DenseMatrix).IsSerializable はfalseを返します

  • Mathnet.Numerics Matrix ファミリのすべてが [Serializable] とマークされているようですが、それらはすべて同じ非シリアル化動作を示します。

ここで、BinaryFormatter を介してオブジェクトを実行しようとすると、「Type MathNet.Numerics.LinearAlgebra.Double.DenseMatrix は Serializable としてマークされていません」という SerializationException が発生します。

ここで何が起こっているのですか?BinaryFormatter が IsSerializable プロパティを直接見ていることはわかっているので、せき止めているのはそのためです。では、なぜ IsSerializable が false を返すのでしょうか?

編集

質問は、一般的に IsSerializable の .NET 実装に向けられており、Mathnet の例のみをコンテキストとして使用しています。

2回目の編集

混乱を助長したのは、MathNet の「ポータブル」ライブラリ バージョンを使用していたという事実だと思います。ポータブル ライブラリをコンパイルするために、ポータブル ライブラリでは System.SerializableAttribute を使用できないため、使用されるカスタム SerializableAttribute を作成しました。Mono で実行すると、System.Type は System.SerializableAttribute を探しますが、MathNet.SerializableAttribute しか見つけられません。

4

1 に答える 1

1

.NET は [Serializable] とマークされたオブジェクトのすべてのメンバーを再帰的にチェックし、[Serializable] クラスのいずれかのメンバーの型も [Serializable] とマークされていない場合、IsSerializable は false を返します。

上記のケースの解決策は、単純に DenseMatrix のメンバーであるクラスを [Serializable] としてマークすることです。

つまり、DenseColumnMatrixStorage

マトリックスストレージ

于 2012-11-21T21:20:01.387 に答える