我正在尝试序列化DenseMatrix对象,该对象是MathNET Numerics项目中提供的对象。
下面我提供了一些有用的信息。
我可以从对象资源管理器和.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。
答案 0 :(得分:1)
.NET递归检查标记为[Serializable]的对象的所有成员,如果[Serializable]类的任何成员的类型也未标记为[Serializable],则IsSerializable返回false。
上述案例的解决方案是简单地将DenseMatrix中成员的类标记为[Serializable]。
即。 DenseColumnMatrixStorage
MatrixStorage