Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/328.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#_Binary_Binarywriter - Fatal编程技术网

C# 如何将未知类型的对象写入二进制文件?

C# 如何将未知类型的对象写入二进制文件?,c#,binary,binarywriter,C#,Binary,Binarywriter,这基本上就像一个普通的二进制编写器。。。假设你有一个物体,你不知道它是什么,但你有它。如何将二进制数据写入二进制文件,以便以后检索 我不知道该怎么做的最初想法是: 以某种方式找出对象的所有成员(可能是反射) 除非成员的类型可由BinaryWriter写入,否则对该成员重复步骤1 制作一个标题,说明成员的类型以及如何(以某种方式)将其组装到对象中 写标题的东西 编写所有核心级别的成员 我不知道如何使用反射,所以我不知道如何做上述大部分工作。 然而,这应该是完全可行的 如果可能的话,我应该怎么做?或

这基本上就像一个普通的二进制编写器。。。假设你有一个物体,你不知道它是什么,但你有它。如何将二进制数据写入二进制文件,以便以后检索

我不知道该怎么做的最初想法是:

  • 以某种方式找出对象的所有成员(可能是反射)
  • 除非成员的类型可由BinaryWriter写入,否则对该成员重复步骤1
  • 制作一个标题,说明成员的类型以及如何(以某种方式)将其组装到对象中
  • 写标题的东西
  • 编写所有核心级别的成员
  • 我不知道如何使用反射,所以我不知道如何做上述大部分工作。 然而,这应该是完全可行的

    如果可能的话,我应该怎么做?或者我应该如何实现上述功能

    bin
    

    最简单的方法是使用。但是,如果要加载应用程序以前版本保存的实例,则在对类进行任何更改时都应非常小心。

    可能需要使用。但是想想一个对象结构,其中有许多
    未知的
    对象,它们都引用一个公共对象。如果序列化所有
    unknown
    对象,则最终得到的公共对象副本数量与
    unknown
    对象的数量相同

    而且
    未知
    对象的许多字段可能不相关,因为它们是由构造函数或其他类设置的,反序列化时可能处于不一致的状态


    所以序列化它们可能并不难,但是您想如何反序列化它们呢

    困难的方面不是写出对象,而是读回它们。NET framework为类类型的序列化和反序列化提供了各种技术,这些技术应该能够自动化该过程,但我熟悉的所有内置技术都有各种限制

    一个主要的问题是.NET不区分存储位置,该存储位置保存对对象的引用,用于标识其他代码使用的对象,仅用于标识对象状态的不可变方面(身份除外),或用于封装对象的可变状态。如果不知道字段应该表示什么,就不可能知道它应该如何序列化或反序列化。例如,假设某个特定类型有一个类型为
    int[]
    的字段,该字段包含对单个元素数组的引用,该数组包含值23。可能该字段的目的是保存值23,也可能该字段的目的是标识一个数组,该数组的第一个元素在每次发生事件时都应递增。在前一个场景中,序列化应该写出这样一个事实:它是一个包含值23的单元素数组。在后一种情况下,如果要实现序列化,则需要了解字段所引用的数组的重要意义

    虽然很多人编写了各种方法来自动序列化各种类,但我倾向于对这些事情持怀疑态度。如果不知道类的字段是用来做什么的,那么就应该谨慎地假设封装了什么状态