C# 无默认构造函数C的反序列化#

C# 无默认构造函数C的反序列化#,c#,deserialization,C#,Deserialization,我有一个需求,我需要反序列化并创建一些没有默认构造函数的类(表)的对象 我的代码片段 else if (reader.Name == "Tables") { reader.ReadStartElement(); tables = SerializationHelper<Table>.DeserializeList(reader); } else if(reader.Name==“Tables”) { reader.ReadStartElement(); tables

我有一个需求,我需要反序列化并创建一些没有默认构造函数的类(表)的对象

我的代码片段

else if (reader.Name == "Tables")
{
    reader.ReadStartElement();
    tables = SerializationHelper<Table>.DeserializeList(reader);
}
else if(reader.Name==“Tables”)
{
reader.ReadStartElement();
tables=SerializationHelper.DeserializeList(读取器);
}
SerializationHelper中反序列化列表的定义如下:

public static List<T> DeserializeList(XmlReader reader)
{
    XmlSerializer ser = new XmlSerializer(typeof(T));
    List<T> returnval = new List<T>();
    while (reader.NodeType != XmlNodeType.EndElement)
    {
        T result = (T)ser.Deserialize(reader);
        returnval.Add(result);
    }
    return returnval;
}
公共静态列表反序列化列表(XmlReader)
{
XmlSerializer ser=新的XmlSerializer(typeof(T));
List returnval=新列表();
while(reader.NodeType!=XmlNodeType.EndElement)
{
T结果=(T)序列反序列化(读取器);
returnval.Add(结果);
}
返回值;
}
这是一个现有的工作代码,随着最近的更改,我们不得不向类中的所有构造函数添加一个委托参数

这里的Table类现在没有任何无参数构造函数

我想知道在反序列化表对象时是否可以至少传递一个参数

我已经阅读了以下内容,但他们使用的是JSON.net,在我的例子中,JSON.net不是一个可以使用的选项


你不能。反序列化程序应该如何猜测使用哪个构造函数?它将在哪里找到要传递给它的参数?这些东西需要一个默认构造函数,即使它是受保护的。如果需要使用
XmlSerializer
,则无法。。。这是一个限制serializer@Jcl我怀疑任何序列化程序在不知道使用哪个构造函数的情况下都能以通用方式工作。@PanagiotisKanavos实际上有一些选项(如),但
XmlSerializer
没有使用它们:-)
BinaryFormatter
确实使用了这些选项。这肯定是有风险的,不可取,但也有可能done@Jcl这只是因为它序列化了整个实例,包括从未包含在XML/Json文件中的私有数据。如果我没有弄错的话,内置反序列化的无参数构造函数必须是
public
。请解释为什么这回答了OP的问题。只有代码的答案通常被认为是低质量的。假设OP要求一个没有默认构造函数的解决方案,那么您必须解释为什么您的解决方案会引入默认构造函数constructor@ShekarGurram请在问题本身中解释你想要什么。同时发布相关代码。反序列化的对象读取嵌套对象不会有问题,那么您所指的对象是什么?是否可以添加默认构造函数?如果不是,原因是什么?@Codor No它可以是私有的。它导致
没有为“[object]”类型定义无参数构造函数。
异常
public class Tables
{
    public Tables(object Mandate)
    {

    }

    private Tables()
    {
        // Private parameterless constructor. Leave private so that it forces everyone to use the Mandate parameter but allows serialization to work. 
    }
}