C# 有人能给我解释一下反序列化的内部原理吗?

C# 有人能给我解释一下反序列化的内部原理吗?,c#,C#,我想知道反序列化是如何工作的,是否真的需要在反序列化发生的系统上安装程序集。如果您还没有查看,请查看。它将告诉您需要了解的有关序列化/反序列化过程的所有信息…至少足以使用它。我给你的链接是“如何反序列化” 至于更多的技术方面,将被序列化的信息片段正是填充该结构/类/对象所需要的 我不太清楚你关于大会问题的第二部分是什么意思。但是,如果要序列化结构(例如),则为了反序列化到另一台计算机或应用程序,必须具有完全相同的结构:名称、字段、数据类型等。如果要查找确切的详细信息,您可以启动的实例并将其指向m

我想知道反序列化是如何工作的,是否真的需要在反序列化发生的系统上安装程序集。

如果您还没有查看,请查看。它将告诉您需要了解的有关序列化/反序列化过程的所有信息…至少足以使用它。我给你的链接是“如何反序列化”

至于更多的技术方面,将被序列化的信息片段正是填充该结构/类/对象所需要的

我不太清楚你关于大会问题的第二部分是什么意思。但是,如果要序列化结构(例如),则为了反序列化到另一台计算机或应用程序,必须具有完全相同的结构:名称、字段、数据类型等。如果要查找确切的详细信息,您可以启动的实例并将其指向
mscorlib
,然后查看
System.Runtime.Serialization
命名空间中的各种类。这是一个高层次的想法(据我所知):

第一步是确保写入二进制流的类型系统与读取二进制流的类型系统相同。由于输出中附加的元信息太少,如果我们不查看相同的类型,可能会出现问题。如果我们有两个类名为
A
,但作者认为
A
类{int m_A,m_b;}
,而读者认为
A
类{int m_b,m_A;
,我们就会有问题。如果类型明显不同,这个问题会更糟。记住这一点,它会在以后回来

好的,我们读写的都是同样的类型。下一步是查找要序列化的对象的所有成员。您可以通过像
typeof(T).GetFields(~System.reflection.BindingFlags.Default)
这样的调用通过反射来实现这一点,但这将非常慢(经验法则:反射很慢)。幸运的是,.NET的内部调用要快得多

第一步:现在我们开始写作。第一:编写器编写我们序列化的对象所在的位置。然后,读者可以确认他们确实加载了这个程序集。接下来,写入对象的命名空间限定类型,以便读取器可以读入适当的对象。这基本上保证了读类型和写类型是相同的

步骤2:实际写入对象的时间。查看的方法可以让我们知道,有一些基本功能可用于编写
int
s、
float
s和各种简单类型。按照预先确定的顺序(声明顺序,从基类的字段开始),将每个字段写入输出。对于不是简单类型的字段,使用该字段中的对象返回步骤1


要进行反序列化,您需要执行这些相同的步骤,只需将“write”等所有动词替换为“read”等动词。顺序非常重要。

来自XML还是二进制?奇怪的是,它们的运作方式完全不同。更好的问题可能是:为什么需要装配?如果您要使用非.NET,那么XML序列化(或其他纯文本序列化格式)是最佳选择。在这种情况下,您不需要了解
XmlSerializer
的内部结构。如果您使用的是.NET到.NET的通信,那么最好让框架为您处理所有事情。事实上,我问这个问题只是因为我对反序列化是如何发生的感到愤怒。此外,当序列化发生时,除了对象之外的哪些信息正在被序列化。