【发布时间】:2018-08-06 08:30:04
【问题描述】:
我需要反序列化原始二进制数据(BinaryFormatter),然后序列化为 JSON(用于编辑),然后再次将其序列化回二进制。
显然,我在花车上输了。当我从 原始二进制文件 序列化时,原始浮点值 0xF9FF4FC1(大端,大致 -12.9999933)被四舍五入为 0xF6FF4FC1(-12.99999) >(正确数据和中间数据在内存中是 1:1)到 JSON。我知道这不是什么大损失,而且我知道浮点数是有问题的,但由于以后可能出现不兼容问题,我希望尽可能保持精度。
之前有人用 JSON 解决过这个问题吗?如何强制它以最大精度写入浮点数?我尝试了将浮点数处理为十进制或双精度的内置选项,但不幸的是,输出没有区别,而且我无法更改目标值,因为当我进行二进制序列化时它们仍然需要写为浮点数,所以会有舍入无论在隐式转换期间。
我尝试往返的包含浮点数的特定类型是来自https://github.com/FNA-XNA/FNA/blob/master/src/Vector2.cs 的Vector2。
tl:dr 有一个浮点数,希望 JsonNET 将其尽可能精确地序列化为最终的 json 字符串。
附:我在这里阅读了大量的问题和其他地方的博客文章,但没有发现任何人试图解决相同的问题,大多数搜索结果都与浮动阅读问题有关(我稍后也需要解决)。
更新: 正如下面的@dbc 所指出的 - Jsont.NET 尊重“TypeConverter”属性,因此我必须制作自己的转换器来覆盖它。
【问题讨论】:
-
在 SO 上发誓不好。
-
我标记为重复的问题是相反的情况 - 限制小数位数。但两者都在控制小数位数。而不是 `writer.WriteRawValue(JsonConvert.ToString(value));` 你会使用 `writer.WriteRawValue(((float)value).ToString('r'));` 作为往返格式。
-
无法复制,请参阅dotnetfiddle.net/qBqBdW。我想我们可能需要查看minimal reproducible example 来帮助您。另外,您使用的是什么版本的 Json.NET?
-
哦,该死,你说得对,它有 TypeConverter:
https://github.com/FNA-XNA/FNA/blob/c77c82837af89e28e9e71106a3637236c215ada3/src/Vector2.cs--- 有没有办法绕过它/忽略它?
标签: c# json floating-point json.net