C# 是否在一个文件中存储多个序列化格式?避免集合的序列化膨胀
这个简单的问题,到目前为止我还没有找到答案。(在我键入这一点时提出的类似问题与此无关——但我不敢相信我是唯一面临这一挑战的人。) 假设我在内存中有一个包含C# 是否在一个文件中存储多个序列化格式?避免集合的序列化膨胀,c#,json,xml,serialization,yaml,C#,Json,Xml,Serialization,Yaml,这个简单的问题,到目前为止我还没有找到答案。(在我键入这一点时提出的类似问题与此无关——但我不敢相信我是唯一面临这一挑战的人。) 假设我在内存中有一个包含 简单类型(例如名称、计算机名、创建日期、配置等);及 某种类型的集合(例如统计指标的时间序列,例如移动平均值) 将这些文件序列化是有意义的 以功能齐全的序列化格式存储简单类型,例如JSON、XML、YAML 将集合值存储在CSV文件中(为每个条目保存不必要的重复标记) 但这意味着我最终得到了两个文件。如果所有信息都在一个文件中就更好了,这样读
[简单类型的JSON]
[CSV供收集]
[CSV供收集]
然后只需打开文件,将XML解析为单独的JSON和CSV部分,并按正常方式进行处理
这是明智的做法吗?有风险吗
或者在任何地方都有这样的图书馆吗?我使用的是C#,因此需要一个.NET库。我质疑为什么这样做有意义 主要地,建议的使用XML的解决方案只是使用另一种序列化格式。让我们看看我们是否能实现既定目标: 为每个条目保存不必要的重复标记 和亚姆。借用您的示例,假设我们将
名称
和计算机名称
作为“简单”数据,并将时间列表中的一些数据作为“收集数据”附加。简单方法如下所示:
name: My Name
computer_name: My Computer
collection:
- time: 1:30
data: foo
- time: 2:20
data: bar
name: My Name
computer_name: My Computer
...
1:30;foo
2:20;bar
没有重复的标记。当反序列化为正确的类型时,YAML将知道集合:
的值将是一个没有显式标记的数据点列表。但是,我们有一个开销,因为我们每次都指定字段名time
和data
。因此,让我们尝试摆脱它们:
name: My Name
computer_name: My Computer
collection:
- [ 1:30, foo ]
- [ 2:20, bar ]
大多数YAML框架将提供必要的功能,以将这些YAML序列反序列化为适当的数据类。我们仍然使用YAML语法。现在,让我们看看是否可以在其中获得实际的CSV:
name: My Name
computer_name: My Computer
collection: |
1:30;foo
2:20;bar
使用YAML文本块标量,我们现在将集合数据作为标量输入,然后可以使用CSV解析器进行解析。我们甚至可以指示YAML实现在遇到集合:
的值时立即执行此操作
使用JSON作为主序列化格式将更难做到这一点,因为JSON没有配备块标量。XML也可以工作,但它本身非常膨胀
当我们在YAML时,还有另一种可能的解决方案:使用文档结束标记向YAML解析器发出信号,表明YAML文档在此处结束,并将CSV数据放在其后面。在Jekyll中也会执行类似的操作,以将“YAML前端内容”从内容中分离出来。看起来是这样的:
name: My Name
computer_name: My Computer
collection:
- time: 1:30
data: foo
- time: 2:20
data: bar
name: My Name
computer_name: My Computer
...
1:30;foo
2:20;bar
..
是文档结束标记。Jekyll使用了--
,根据规范,它将在那里开始第二个YAML文档,我不知道他们为什么选择这样做。..
是更符合规范的方式。我质疑为什么这样做有意义
主要来说,建议使用XML的解决方案只是使用另一种序列化格式。让我们看看是否可以实现所述目标:
为每个条目保存不必要的重复标记
对于YAML。借用您的示例,假设我们将名称
和计算机名称
作为“简单”数据,并将带有一些数据的时间列表作为“收集数据”。简单方法如下所示:
name: My Name
computer_name: My Computer
collection:
- time: 1:30
data: foo
- time: 2:20
data: bar
name: My Name
computer_name: My Computer
...
1:30;foo
2:20;bar
没有重复的标记。当反序列化为正确的类型时,YAML将知道集合:
的值将是一个没有显式标记的数据点列表。但是,我们有一个开销,因为我们每次都指定字段名time
和data
。因此,让我们尝试摆脱它们:
name: My Name
computer_name: My Computer
collection:
- [ 1:30, foo ]
- [ 2:20, bar ]
大多数YAML框架将提供必要的功能,以将这些YAML序列反序列化为适当的数据类。我们仍然使用YAML语法。现在,让我们看看是否可以在其中获得实际的CSV:
name: My Name
computer_name: My Computer
collection: |
1:30;foo
2:20;bar
使用YAML文本块标量,我们现在将集合数据作为标量输入,然后可以使用CSV解析器进行解析。我们甚至可以指示YAML实现在遇到集合:
的值时立即执行此操作
使用JSON作为主序列化格式将更难做到这一点,因为JSON没有配备块标量。XML也可以工作,但它本身非常膨胀
当我们在YAML时,还有另一种可能的解决方案:使用文档结束标记向YAML解析器发出信号,表明YAML文档在此处结束,并将CSV数据放在其后面。在Jekyll中也会执行类似的操作,以将“YAML前端内容”从内容中分离出来。看起来是这样的:
name: My Name
computer_name: My Computer
collection:
- time: 1:30
data: foo
- time: 2:20
data: bar
name: My Name
computer_name: My Computer
...
1:30;foo
2:20;bar
..
是文档结束标记。Jekyll使用了--
,根据规范,它将在那里开始第二个YAML文档,我不知道他们为什么选择这样做。..
是更符合规范的方式。参见此
使用xmldattribute
创建一些模型:
public class Foo
{
[XmlAttribute]
public string Bar { get; set; }
[XmlAttribute]
public List<int> List1 { get; set; }
[XmlAttribute]
public List<double> List2 { get; set; }
}
公共类Foo
{
[XmlAttribute]
公共字符串条{get;set;}
[XmlAttribute]
公开名单李