- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我们使用 Json.net 进行序列化。我们希望允许几乎任何类型的用户定义的类/消息是可序列化的。
Json.net 无法开箱即用的一件事是,如果您将 int
、float
或 decimal
存储在 对象
字段。例如
public class SomeMessage
{
public object Something {get;set;}
}
如果我在 Something 字段中存储 int
、float
或 decimal
,它将被反序列化为 long
或 double
(因为 json.net 只能猜测 json 中原语的类型(“foo”:123 <- int 或 long?)
我完全知道我可以在属性上使用正确的类型并设置各种提示。
但我想为任何随机类/消息解决这个问题。
我目前的方法是自定义 JsonConverter,它处理上述类型,然后将它们序列化为代理类型,该代理类型将值保存为字符串和这是什么类型的鉴别器。然后在 ReadJson 上,我将其恢复为正确的类型。
这样做有很多过热的地方。特别是对于代理类型的类型名。 “foo.bar.baz.PrimitiveSurrogate, mylib”
我可以自定义此类型名称的存储方式吗?例如如果我想将别名应用于某些特定类型?
还有其他方法吗?我可以将整个东西序列化为一个特殊的字符串,它会更小,但话又说回来,这感觉很不稳定。
那么,如果我想在存储在无类型结构中时保持原语的正确类型,我有什么选择?
[编辑]
普通 Json:
{
"foo":123
}
对比
我们当前的代理版本:
{
"foo": {
"$type":"Akka.Serialization.PrimitiveSurrogate, Akka",
"V":"123",
"T":1
}
}
我可以只用 `"V":"123L"替换 V 和 T 并解析后缀,因为我们只在该类型中存储 int、float 和 decimal,所以我们可以轻松地拥有一个硬编码的描述符。
但是,这仍然没有摆脱代理本身的 $type,我想至少将其缩短为类似 `"$type":"Surrogate"或那个方向的东西。
[再次编辑]我把它归结为:
{"$type":"Akka.Util.PrimitiveSurrogate, Akka","V":"F123.456"}
但我真的很想摆脱长类型名并以某种方式替换为别名。
[再次编辑]
我现在已经把它归结为:
{"$":"M123.456"}
在我看来,这已经足够好了。我们不需要与任何其他 json 系统互操作,它只是我们两端的框架,所以即使它不漂亮,组成的格式也能工作。
最佳答案
有效负载的大小有多重要?例如,您可以嵌入有关每个原语类型的元数据,本质上是将数据契约与数据捆绑在一起。例如:
{
"someInteger": 123,
"$someInteger.clrType": " System.Int32"
}
编辑:
如果负载大小是最重要的,你可以这样做:
{
"someInteger.i": 123
}
这会将有效载荷增加到每个原始值两个字符。我很确定这个点可以安全地用作分隔符;也就是说,CLR 标识符不可能有标识符“someInteger.i”,尽管我会根据规范仔细检查这一点(CLR 中允许的标识符字符由以下文档管理,附件 7 http://www.unicode.org/reports/tr15/tr15-18.html#Programming%20Language%20Identifiers) .
如果您真的想压缩它,您可以删除分隔符 (.) 并使用 CLR 规范不允许的单个 Unicode 字符作为属性名称的后缀,以表示所需的原始类型。有点 hacky,但它会减少另一个字节的有效负载。 ;-)
关于c# - 使用 Json.NET 替代 int、float 和 decimal,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29009581/
我是 Python 编程的新手,最近我一直在学习数据类型的某些方面。正如我所读,decimal.Decimal() 方法创建了一个小数对象; decimal.Decimal.from_float()
这是我今天在 filmmaster.com: 遇到的错误 PicklingError: Can't pickle : it's not the same object as decimal.Decim
简单的问题 - 为什么 Decimal 类型定义这些常量?何必呢? 我正在寻找一个原因,为什么这是由语言定义的,而不是可能的用途或对编译器的影响。为什么首先把它放在那里?编译器可以像 Decimal.
我在用 Python 编码为 JSON 时遇到问题,特别是 decimal.Decimal 值。我正在使用它为 Google App Engine 应用程序输出 JSON。 为了避免 Python 中
我在 Django 项目中有一些 python 代码曾经可以正常工作。托管该项目的服务器丢失了,我不得不将代码复制到新服务器上。现在,我收到一个似乎毫无意义的错误。 我的一个 python 文件中包含
我发现生成具有特定数量 的 decimal.Decimal 数字的最佳方法 significant figures 是用来初始化下面的变量 kluge 的: import decimal THIS_I
我在应用空合并运算符时遇到以下错误。 private decimal _currentImpulseId; // ... later on used in public property getter
我想使用 decimal.Decimal 对转换后的数字字符串进行算术运算。无论转换后的数字字符串有多少小数,我都希望返回有两位小数。 在这种特殊情况下,为什么两位小数精度返回一位小数,为什么三位小数
我想使用 decimal.Decimal 对转换后的数字字符串进行算术运算。无论转换后的数字字符串有多少小数,我都希望返回有两位小数。 在这种特殊情况下,为什么两位小数精度返回一位小数,为什么三位小数
是什么导致 sum 始终为 null? object[] data = new object[] { 2.2M, 3m, 1, "string", true,
我似乎失去了很多 float 的精度。 例如我需要求解一个矩阵: 4.0x -2.0y 1.0z =11.0 1.0x +5.0y -3.0z =-6.0 2.0x +2.0y +5.0z =7.0
这个问题在这里已经有了答案: Why python decimal.Decimal precision differs with equable args? (2 个答案) 关闭 5 年前。 我知道
当我尝试转换 Task 时出现此错误至 decimal : Could not load file or assembly 'EntityFramework, Version=5.0.0.0, Cul
我听到有人说在 C# 中,大写十进制比小写十进制使用更多的内存,因为小写十进制被解析为小写十进制并且需要内存。 这是真的吗? 最佳答案 没有。 decimal 只是 System.Decimal 的别
我有一个对象,它是 dict、list、常规数据类型和 decimal.Decimal 的嵌套组合。我想用 PyMongo 将这个对象插入到 MongoDB 中。 PyMongo 拒绝插入 Decim
sdr 是我的 sqldatareader,我想检查小数类型的 curPrice 值是否为空。 inrec.curPrice = sdr.IsDBNull(7) ? (十进制?)空:sdr.GetDe
变量 'a' 的类型可以是 - int/float/decimal.Decimal(但不是字符串) 我想检查它是否是 decimal.Decimal 类型。 以下作品: import decimal
我正在使用一个在函数调用中使用一些十进制类型参数的库。但是我有 numpy.int32 类型变量。当我将它传递给函数调用时,出现以下错误: TypeError: conversion from num
考虑以下代码: public class DecimalWrapper { public static implicit operator DecimalWrapper
考虑以下代码: public class DecimalWrapper { public static implicit operator DecimalWrapper
我是一名优秀的程序员,十分优秀!