Por qué la clase XML-Serializable necesita un constructor sin parámetros

Estoy escribiendo código para hacer la serialización Xml. Con la función de abajo

public static string SerializeToXml(object obj) { XmlSerializer serializer = new XmlSerializer(obj.GetType()); using (StringWriter writer = new StringWriter()) { serializer.Serialize(writer, obj); return writer.ToString(); } } 

Si el argumento es una instancia de clase sin constructor sin parámetros, arrojará una excepción.

Excepción no controlada: System.InvalidOperationException: CSharpConsole.Foo no se puede serializar porque no tiene un constructor sin parámetros. en System.Xml.Serialization.TypeDesc.CheckSupported () en System.Xml.Serialization.TypeScope.GetTypeDesc (Type type, MemberInfo sourc e, Boolean directReference, Boolean throwOnError) en System.Xml.Serialization.ModelScope.GetTypeModel (Type type, Boolean direct Reference) en System.Xml.Serialization.XmlReflectionImporter.ImportTypeMapping (Tipo de tipo, XmlRootAttribute root, String defaultNamespace) en System.Xml.Serialization.XmlSerializer..ctor (Tipo de tipo, String defaultName space) en System.Xml.Serialization. XmlSerializer..ctor (Tipo de tipo)

¿Por qué debe haber un constructor sin parámetros para permitir que la serialización xml tenga éxito?

EDIT: gracias por la respuesta de cfeduke. El constructor sin parámetros puede ser privado o interno.

Durante la deserialización de un objeto, la clase responsable de deserializar un objeto crea una instancia de la clase serializada y luego procede a rellenar los campos y propiedades serializados solo después de adquirir una instancia para rellenar.

Puede hacer que su constructor sea private o internal si lo desea, siempre que no tenga parámetros.

Esta es una limitación de XmlSerializer . Tenga en cuenta que BinaryFormatter y DataContractSerializer no requieren esto: pueden crear un objeto no inicializado fuera del éter e inicializarlo durante la deserialización.

Como está utilizando xml, podría considerar usar DataContractSerializer y marcar su clase con [DataContract] / [DataMember ], pero tenga en cuenta que esto cambia el esquema (por ejemplo, no hay un equivalente de [XmlAttribute] – todo se convierte en elementos).

Actualización: si realmente quieres saber, BinaryFormatter et al usan FormatterServices.GetUninitializedObject() para crear el objeto sin invocar al constructor. Probablemente peligroso; No recomiendo usarlo con demasiada frecuencia ;-p Consulte también los comentarios en MSDN:

Debido a que la nueva instancia del objeto se inicializa a cero y no se ejecutan constructores, es posible que el objeto no represente un estado considerado válido por ese objeto. El método actual solo debe utilizarse para la deserialización cuando el usuario tiene la intención de poblar inmediatamente todos los campos. No crea una cadena no inicializada, ya que crear una instancia vacía de un tipo inmutable no sirve para nada.

Tengo mi propio motor de serialización, pero no pretendo que use FormatterServices ; Me gusta saber que un constructor ( cualquier constructor) se ha ejecutado realmente.

En primer lugar, esto está escrito en la documentación . Creo que es uno de los campos de su clase, no el principal, y ¿cómo quiere que el deserializador lo construya sin construcción sin parámetros?

Creo que hay una solución para hacer que el constructor sea privado.