【发布时间】:2020-05-31 23:07:13
【问题描述】:
在有许多奶牛和一些农民负责其中一些奶牛的农场中,PreserveReferencesHandling 显着减少了生成的 json 的大小(在这种情况下为 45%)。
public class Farm
{
public List<Cow> cows;
public List<Farmer> farmers;
public List<List<Farmer>> teams;
...
}
public class Cow
{
//Some properties...
}
public class Farmer
{
public List<Cow> cows;
...
}
如果关闭 PreserveReferencesHandling,这可能会导致在 json 中不必要地复制大量奶牛,这取决于可能存在的任何实现,实际上可能会破坏程序,例如因为相等性检查失败。
例如: 没有 PreserveReferencesHandling
// characters: 985
{
"cows": [
{"name":"SmallCow"},
{"name":"Cow"},
{"name":"BigCow"}
],
"farmers":[
{"name":"Joe", "cows":[{"name":"SmallCow"}, {"name":"Cow"}]},
{"name":"Chris", "cows":[{"name":"SmallCow"}, {"name":"BigCow"}]},
{"name":"Chris Junior", "cows":[{"name":"SmallCow"}, {"name":"BigCow"}]},
{"name":"Bob", "cows":[{"name":"SmallCow"}, {"name":"Cow"}, {"name":"BigCow"}]}
],
"teams": [
[{"name":"Joe", "cows":[{"name":"SmallCow"}, {"name":"Cow"}]}, {"name":"Chris", "cows":[{"name":"SmallCow"}, {"name":"BigCow"}]}],
[{"name":"Chris Junior", "cows":[{"name":"SmallCow"}, {"name":"BigCow"}]}, {"name":"Chris", "cows":[{"name":"SmallCow"}, {"name":"BigCow"}]}],
[{"name":"Joe", "cows":[{"name":"SmallCow"}, {"name":"Cow"}]},
{"name":"Chris", "cows":[{"name":"SmallCow"}, {"name":"BigCow"}]},
{"name":"Chris Junior", "cows":[{"name":"SmallCow"}, {"name":"BigCow"}]},
{"name":"Bob", "cows":[{"name":"SmallCow"}, {"name":"Cow"}, {"name":"BigCow"}]}]
]
}
使用 PreserveReferencesHandling.Objects
// characters: 547
{
"cows": [
{"$id": 0, "name":"SmallCow"},
{"$id": 1,"name":"Cow"},
{"$id": 2,"name":"BigCow"}
],
"farmers":[
{"$id": 3, "name":"Joe", "cows":[{"$ref": 0}, {"$ref": 1}]},
{"$id": 4, "name":"Chris", "cows":[{"$ref": 0}, {"$ref": 2}]},
{"$id": 5, "name":"Chris Junior", "cows":[{"$ref": 0}, {"$ref": 2}]},
{"$id": 6, "name":"Bob", "cows":[{"$ref": 0}, {"$ref": 1}, {"$ref": 2}]}
],
"teams": [
[{"$ref" : 3}, {"$ref" : 4}],
[{"$ref" : 5}, {"$ref" : 4}],
[{"$ref" : 3}, {"$ref" : 4}, {"$ref" : 5}, {"$ref" : 6}]
]
}
这个例子在某种程度上是为了显示差异而设计的,但我认为这种内存节省只会在数据系统变得更加复杂和相互关联时变得更加明显。
PreserveReferenceHandling 的优缺点是什么?哪个设置最有用,PreserveReferenceHandling.Objects、PreserveReferenceHandling.Arrays 还是 PreserveReferenceHandling.All?
【问题讨论】:
标签: c# json performance serialization json.net