2016-03-21 69 views
1

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

我的代码片段

else if (reader.Name == "Tables") 
{ 
    reader.ReadStartElement(); 
    tables = SerializationHelper<Table>.DeserializeList(reader); 
} 

在SerializationHelper的DeserializeList的定义如下:

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; 
} 

这是现有的工作代码,并与近期的变化,我们不得不授权参数添加到该类中的所有构造函数

此处的Table类现在没有任何无参数构造函数。

我想知道在DeSerializing Table对象时,我是否可以传递至少一个参数。

我已阅读以下内容,但他们使用JSON.net,在我的情况下是不是一个选项使用。

JSON.net: how to deserialize without using the default constructor?

How to deserialize class without calling a constructor?

+1

你不能。解串器应该如何猜测使用哪个构造函数?它会在哪里找到传递给它的参数?你需要这些东西的默认构造函数,即使它被保护了 –

+1

如果你需要使用'XmlSerializer',那么你不能......这是这个串行器的限制 – Jcl

+0

@Jcl我怀疑*任何串行器都可以工作以通用的方式不知道使用哪个构造函数。 –

回答

-1
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. 
    } 
} 
+0

如果我没有弄错,内置反序列化的无参数构造函数_必须是'public'。 – Codor

+1

请解释为什么这回答OP的问题。仅有代码的答案通常被认为是低质量的。鉴于OP要求解决方案*没有*默认构造函数,你必须解释*为什么*你的解决方案引入了一个默认的构造函数 –

+0

我需要引用'Tables'类中的一个对象,它将在其构造函数中传递。用无参数的构造函数,我会错过它。 –

相关问题