Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/283.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# 是否在一个文件中存储多个序列化格式?避免集合的序列化膨胀_C#_Json_Xml_Serialization_Yaml - Fatal编程技术网

C# 是否在一个文件中存储多个序列化格式?避免集合的序列化膨胀

C# 是否在一个文件中存储多个序列化格式?避免集合的序列化膨胀,c#,json,xml,serialization,yaml,C#,Json,Xml,Serialization,Yaml,这个简单的问题,到目前为止我还没有找到答案。(在我键入这一点时提出的类似问题与此无关——但我不敢相信我是唯一面临这一挑战的人。) 假设我在内存中有一个包含 简单类型(例如名称、计算机名、创建日期、配置等);及 某种类型的集合(例如统计指标的时间序列,例如移动平均值) 将这些文件序列化是有意义的 以功能齐全的序列化格式存储简单类型,例如JSON、XML、YAML 将集合值存储在CSV文件中(为每个条目保存不必要的重复标记) 但这意味着我最终得到了两个文件。如果所有信息都在一个文件中就更好了,这样读

这个简单的问题,到目前为止我还没有找到答案。(在我键入这一点时提出的类似问题与此无关——但我不敢相信我是唯一面临这一挑战的人。)

假设我在内存中有一个包含

  • 简单类型(例如名称、计算机名、创建日期、配置等);及
  • 某种类型的集合(例如统计指标的时间序列,例如移动平均值)
  • 将这些文件序列化是有意义的

  • 以功能齐全的序列化格式存储简单类型,例如JSON、XML、YAML
  • 将集合值存储在CSV文件中(为每个条目保存不必要的重复标记)
  • 但这意味着我最终得到了两个文件。如果所有信息都在一个文件中就更好了,这样读者就可以清楚地理解(2)源于(1)。也更易于在文件系统中维护

    我不想合并成一个BLOB,因为这样会失去人类的可读性

    是否有一种简单的技术可以将(1)中的JSON和(2)中的CSV组合到一个文件中

    我的第一个猜测是使用(比如)XML标记来分隔不同的类型。 e、 g

    
    [简单类型的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]
    公开名单李