C# 为什么XmlSerializer需要声明为公共的序列化对象的类?

C# 为什么XmlSerializer需要声明为公共的序列化对象的类?,c#,.net,xml-serialization,C#,.net,Xml Serialization,众所周知,为了能够使用XmlSerializer序列化对象,必须将它们的类声明为公共类,否则会出现InvalidOperationException。这里的问题是为什么?我和我发现XmlSerializer实际上生成并编译了一个全新的程序集,然后使用这个程序集序列化对象。问题仍然是,为什么它要求类是公共的,而使用反射很容易访问程序集中的内部类型 原因很简单,因为从第一天起就一直如此 而且,反射是昂贵的。如果你不必这么做,为什么要这么做 此外,XML序列化程序并不打算序列化世界上的每个类。它旨在序

众所周知,为了能够使用XmlSerializer序列化对象,必须将它们的类声明为公共类,否则会出现InvalidOperationException。这里的问题是为什么?我和我发现XmlSerializer实际上生成并编译了一个全新的程序集,然后使用这个程序集序列化对象。问题仍然是,为什么它要求类是公共的,而使用反射很容易访问程序集中的内部类型

原因很简单,因为从第一天起就一直如此

而且,反射是昂贵的。如果你不必这么做,为什么要这么做

此外,XML序列化程序并不打算序列化世界上的每个类。它旨在序列化设计为序列化的类。因此,确保所需数据位于具有公共无参数构造函数的公共类的公共字段和属性中并不是很大的负担


只有当你试图序列化一个没有被设计为序列化的类型时,你才会遇到麻烦。

原因很简单,因为从第一天起就一直是这样

而且,反射是昂贵的。如果你不必这么做,为什么要这么做

此外,XML序列化程序并不打算序列化世界上的每个类。它旨在序列化设计为序列化的类。因此,确保所需数据位于具有公共无参数构造函数的公共类的公共字段和属性中并不是很大的负担


只有当你试图序列化一个没有被设计为序列化的类型时,你才会遇到麻烦。

很简单,因为它不使用反射来序列化/反序列化你的类-它直接访问公共属性(和类)

使用refleciton访问成员将非常昂贵,因此,正如您在问题中提到的,它会在使用反射后生成一个序列化器类,缓存它*,并从这一点开始使用直接成员访问

  • 我应该限定这一点:它只生成一次序列化程序,并将其缓存在XmlSerializer上的某些构造函数重载中。对于其他人,它会在每次创建序列化程序实例时重新生成序列化程序类
只要您使用香草构造函数,您就可以:

XmlSerializer ser = new XmlSerializer(typeof(MyType));

很简单,因为它不使用反射来序列化/反序列化类——它直接访问公共属性(和类)

使用refleciton访问成员将非常昂贵,因此,正如您在问题中提到的,它会在使用反射后生成一个序列化器类,缓存它*,并从这一点开始使用直接成员访问

  • 我应该限定这一点:它只生成一次序列化程序,并将其缓存在XmlSerializer上的某些构造函数重载中。对于其他人,它会在每次创建序列化程序实例时重新生成序列化程序类
只要您使用香草构造函数,您就可以:

XmlSerializer ser = new XmlSerializer(typeof(MyType));