Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/json/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用Json.NET代理int、float和decimal_C#_Json_Serialization_Json.net - Fatal编程技术网

C# 使用Json.NET代理int、float和decimal

C# 使用Json.NET代理int、float和decimal,c#,json,serialization,json.net,C#,Json,Serialization,Json.net,我们使用Json.net进行序列化。我们想让几乎任何类型的用户定义类/消息都可以序列化 Json.net不支持开箱即用的一件事是,如果在对象字段中存储int、float或decimal。 e、 g 如果我在Something字段中存储int、float或decimal,它将被反序列化为long或double(因为json.net只能猜测json中原语的类型(“foo”):123有效负载的大小有多重要?例如,您可以嵌入关于每个原语类型的元数据,本质上是将数据契约与数据绑定在一起。例如: {

我们使用Json.net进行序列化。我们想让几乎任何类型的用户定义类/消息都可以序列化

Json.net不支持开箱即用的一件事是,如果在
对象
字段中存储
int
float
decimal
。 e、 g


如果我在Something字段中存储
int
float
decimal
,它将被反序列化为
long
double
(因为json.net只能猜测json中原语的类型(“foo”):123有效负载的大小有多重要?例如,您可以嵌入关于每个原语类型的元数据,本质上是将数据契约与数据绑定在一起。例如:

{
    "someInteger": 123,
    "$someInteger.clrType": " System.Int32"
}
编辑:

如果有效负载大小是最重要的,您可以执行以下操作:

{
  "someInteger.i": 123
}
这将使有效负载的增加减少到每个原语值两个字符。我非常确定点可以安全地用作分隔符;即,CLR标识符不可能有标识符“someInteger.I”,尽管我会根据规范对此进行双重检查(CLR中允许的标识符字符受以下文件附件7的管辖)


如果您真的想压缩它,您可以删除分隔符(.)并在属性名称后面加上CLR规范不允许的单个Unicode字符,以表示所需的基元类型。这有点老套,但会将负载减少另一个字节。;-)

我意识到这与您当前的方法非常相似,但是如果我正确地解释了您的问题,我看不到任何解决方法。类型信息必须放在某个地方,如果您不想得到关于类型本身的提示,那么除了序列化负载本身之外,还有什么地方?是的,请参阅我的编辑,我已经添加了当前代理方法的输出。W主要的优先级是什么?负载大小?可移植性/兼容性?性能?负载大小,可能是通过使用JObject手动处理json并对其进行一些自定义检查来实现的。在这种情况下,我认为将类型信息嵌入json键可能是实现这一点的方法(请参阅我上次的编辑)。这样,您可以跳过值周围的引号,只使用1或2个字符来表示类型。不太便于移植,但可能是最紧凑的JSON解决方案。
{
    "foo": {
                  "$type":"Akka.Serialization.PrimitiveSurrogate, Akka",
                  "V":"123",
                  "T":1
             }
}
{"$type":"Akka.Util.PrimitiveSurrogate, Akka","V":"F123.456"}
{"$":"M123.456"}
{
    "someInteger": 123,
    "$someInteger.clrType": " System.Int32"
}
{
  "someInteger.i": 123
}