我正在使用标准BinaryFormatter来序列化一个非常大的对象图,其中混合了一些第三方对象。我尝试过像Protobuf / JSON / XML这样的其他人,但由于某种原因,他们都失败了。数据本质上是复杂AI算法的结果,并且在重度嵌套的树中具有大量的双精度数。其中许多可能是NaN。
似乎当一个double是NaN时,BinaryFormatter会无声地失败并处理它。如果它正确处理它会很好。
this link中描述了核心问题。
有没有解决方法,所以我可以直接处理NaN?我可以直接序列化,但这可能会有很多工作。
修改
在Naive Bayes实施的其中一个重罪犯中,代码为:
public double[][][] Distributions { get; private set; }
public double[] Priors { get; private set; }
答案 0 :(得分:1)
所有这一切都浮现在脑海中。
反序列化时,它适用于流。流只是一个用于读取字节的处理器,您可以编写一个重写另一个流的流。从概念上讲;
public NanToInfStreamReader: IStream
{
NanToInfStreamReader(IStream source)
{
...
}
byte[] Read()
{
return ProtectAgainstNaN(source.Read());
}
}
所以第一部分是编写这样的装饰流,并搜索代表Double.NaN的64位的任何出现。将你的流替换为Double.Inf,比如说。
BinaryFormatter永远不会看到Double.NaN,速度问题也不会发生。
但是,现在你的数据在没有NaN的地方填充了+ Inf,所以你必须返回数组并重写它们。
这不是一个好方法。但听起来你可能会有点卡住,而且这是我能提出的所有建议。