相关疑难解决方法(0)

为什么XML-Serializable类需要无参数构造函数

我正在编写代码来进行Xml序列化.具有以下功能.

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

如果参数是没有无参数构造函数的类的实例,它将抛出异常.

未处理的异常:System.InvalidOperationException:CSharpConsole.Foo无法序列化,因为它没有无参数构造函数.System.Xml.Serialization.ModelScope.GetTypeModel的System.Xml.Serialization.TypeScope.GetTypeDesc(Type type,MemberInfo sourc e,Boolean directReference,Boolean throwOnError)中的System.Xml.Serialization.TypeDesc.CheckSupported()处于类型类型, System.Xml.Serialization上的System.Xml.Serialization.XmlSerializer..ctor(Type type,String defaultName space)中System.Xml.Serialization.XmlReflectionImporter.ImportTypeMapping(Type type,XmlRootAttribute root,String defaultNamespace)的布尔直接引用. XmlSerializer..ctor(类型类型)

为什么必须有一个无参数构造函数才能使xml序列化成功?

编辑:感谢cfeduke的回答.无参数构造函数可以是私有的或内部的.

.net c# xml-serialization

168
推荐指数
3
解决办法
11万
查看次数

我们真的可以调用无参数构造函数的默认构造函数吗?

我对C#中"默认构造函数"的含义感到非常困惑.很多人,包括我的编程教授,只是调用任何无参数构造函数"默认构造函数"(就像这里这里的问题和答案一样).即使是上的SO标签wiki 也说它是"无参数构造函数......经常(注意它经常说,而不是总是)由编译器生成".

如果要遵循此逻辑,构造函数是否为"默认"依赖于您可以如何调用它.即如果您可以将其称为"默认"方式,没有任何参数,则它是默认构造函数.

但是,MSDN,如果我正确地读它,似乎只将名称"default constructor"赋予无参数构造函数,该构造函数在没有指定其他构造函数时隐式生成,调用无参数基类构造函数,并且(与任何其他构造函数一样)将class字段初始化为其值.

考虑一下,这比"default" == "parameterless"以下更有意义:当您没有选择任何其他内容时,隐式生成的构造函数有点像默认选项.

那么,调用所有无参数构造函数的默认构造函数是否正确

或者是它正确调用明确定义形式的构造函数public C(): base() {}(普通班)和protected C(): base() {}(抽象类)默认的构造函数,因为它们适合在MSDN默认构造函数的说明?

或者该术语是否仅适用于隐式生成的构造函数?

另外(可能是最重要的问题):这是该术语最广泛接受的定义,是正确还是不正确?

c# constructor terminology default-constructor

2
推荐指数
1
解决办法
887
查看次数