C# 方法是否也与.NET中的数据成员一起序列化?

C# 方法是否也与.NET中的数据成员一起序列化?,c#,dll,serialization,C#,Dll,Serialization,标题很明显,我需要知道方法是否在C#中与对象实例一起序列化,我知道Java中没有,但我对C#有点陌生。如果没有,我是否必须在将原始类发送到另一台PC时将其与字节流(序列化对象)放在一个包中?原始类是否可以像DLL文件一样?否。类型信息与状态一起序列化。为了反序列化数据,您的程序需要访问包含类型(包括方法)的程序集。方法没有序列化 我不知道您的场景,但是放入一个库(assembly/dll)并在另一端使用该库进行反序列化可以让您获得所有 另外,你可能应该根据你的场景中涉及的因素,创造一些问题,提出

标题很明显,我需要知道方法是否在C#中与对象实例一起序列化,我知道Java中没有,但我对C#有点陌生。如果没有,我是否必须在将原始类发送到另一台PC时将其与字节流(序列化对象)放在一个包中?原始类是否可以像DLL文件一样?

否。类型信息与状态一起序列化。为了反序列化数据,您的程序需要访问包含类型(包括方法)的程序集。

方法没有序列化

我不知道您的场景,但是放入一个库(assembly/dll)并在另一端使用该库进行反序列化可以让您获得所有


另外,你可能应该根据你的场景中涉及的因素,创造一些问题,提出更多的问题。如果您打算动态发送和运行代码,可能会造成可怕的安全后果。

当.NET首次提出序列化时,我感到困惑。我认为这是因为大多数书籍和指南都提到,它允许您将“对象”序列化为XML并移动它们,事实上,您实际上是在水合对象的值,以便以后可以脱水。在任何情况下,您都不会将整个对象保存到磁盘,因为这需要dll,并且不包含在XML文件中。

如果您已经学习了C.A类,则可能更容易理解

class C
{
    private int _m;
    private int _n;

    int Meth(int p)
    {
       return _m + _n + p;
    }
}
本质上是语法上的糖

typedef struct
{
   int _m;
   int _n;
   // NO function pointers necessary
} C;

void C_Meth(C* obj, int p)
{
   return obj->_m + obj->_n + p;
}

这就是在面向对象语言中实现非虚拟方法的基本方式。这里重要的是方法不是实例数据的一部分。

你说的是程序集,所以原始类的方法作为DLL文件可以正常工作,对吗?@Shaza:是的。两侧(序列化和反序列化)都需要包含被序列化类型的程序集(通常为DLL)。这需要是可发现的,以便序列化类正确地实例化类型。它们的行为不同-听起来像是在使用
BinaryFormatter
,但一般来说,您应该尝试明确说明您正在使用的API。没有收到您的评论吗?顺便说一句,序列化几乎与C#无关,而与.NET有关。但是当上面示例中的类C具有虚拟方法时会发生什么?vtable也会被序列化吗?如果是这种情况,那么当您将对象从文件还原(反序列化)到应用程序的新实例时,vtable中的地址不能保证指向函数,对吗?你知道.Net是如何处理这个问题的吗?