3

我正在尝试序列化一个 DenseMatrix 对象,该对象是 MathNET Numerics 项目中提供的一个对象。

密集矩阵.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 运行我的对象时,我得到一个 SerializationException“类型 MathNet.Numerics.LinearAlgebra.Double.DenseMatrix 未标记为可序列化”。

这里发生了什么?我知道 BinaryFormatter 直接查看 IsSerializable 属性,所以这就是它咳嗽的原因。那么为什么 IsSerializable 返回 false 呢?

编辑

该问题通常更多地针对 IsSerializable 的 .NET 实现,并且仅使用 The Mathnet 示例作为上下文。

第二次编辑

我认为增加混乱的是我使用的是 MathNet 的“便携式”库版本。为了使可移植库编译,他们创建了一个自定义的 SerializableAttribute,因为 System.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 回答