IsSerializable为标记为Serializable的对象返回“false”

时间:2012-11-21 19:30:19

标签: c# .net serializable

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

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运行我的对象时,我得到一个SerializationException“Type MathNet.Numerics.LinearAlgebra.Double.DenseMatrix未标记为Serializable”。

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

修改

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

第二次编辑

我认为增加混乱是因为我使用的是MathNet的“便携式”库版本。为了使可移植库编译,他们创建了一个自定义的SerializableAttribute,因为System.SerializableAttribute不适用于可移植库,所以会使用它。使用Mono运行时,System.Type将查找System.SerializableAttribute,但只查找MathNet.SerializableAttribute。

1 个答案:

答案 0 :(得分:1)

.NET递归检查标记为[Serializable]的对象的所有成员,如果[Serializable]类的任何成员的类型也未标记为[Serializable],则IsSerializable返回false。

上述案例的解决方案是简单地将DenseMatrix中成员的类标记为[Serializable]。

即。 DenseColumnMatrixStorage

MatrixStorage