有人可以向我解释反序列化的内部吗?

时间:2010-02-04 06:51:17

标签: c#

我想知道反序列化是如何工作的,并且确实需要在反序列化的系统上安装程序集。

2 个答案:

答案 0 :(得分:1)

如果您还没有查看MSDN,请执行此操作。它将告诉您有关序列化/反序列化过程的所有信息......至少足以使用它。我给你的链接是'如何反序列化'。

就技术方面而言,将序列化的信息将完全是填充该结构/类/对象所需的信息。

我不太确定你关于集会问题的第二部分是什么意思。但是,如果要序列化结构(例如),那么为了反序列化到另一台机器或应用程序,您必须具有完全相同的结构:名称,字段,数据类型等。

答案 1 :(得分:0)

如果您正在寻找完全的详细信息,可以启动Reflector的实例并将其指向mscorlib并查看System.Runtime.Serialization中的各个类。 {1}}命名空间。这是高层次的想法(据我所知):

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

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

第1步:现在我们开始写作了。首先:作者编写我们正在序列化的对象所在的strong-name assembly。读者可以确认他们实际上已经加载了这个程序集。接下来,写入对象的名称空间限定类型,以便读者可以读入正确的对象。这基本上保证了阅读类型和写作类型是一样的。

第2步:实际写入对象的时间。查看Formatter的方法让我们知道有一些基本功能可用于编写int s,float和各种简单类型。以预定顺序(它们被声明的顺序,从基类的字段开始),每个字段被写入输出。对于非简单类型的字段,请使用该字段中的对象递归回到步骤1。

要反序列化,请执行相同的步骤,除了用“read”等动词替换所有动词,例如“write”。订单非常重要。