【发布时间】:2016-07-07 22:32:54
【问题描述】:
我有一个要求,我需要反序列化并创建一些没有默认构造函数的类(表)的对象。
我的代码片段
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 类现在没有任何无参数构造函数。
我想知道在反序列化 Table 对象时是否可以传递至少一个参数。
我已经阅读了以下内容,但他们使用 JSON.net,就我而言,这不是一个可以使用的选项。
JSON.net: how to deserialize without using the default constructor?
【问题讨论】:
-
你不能。反序列化器应该如何猜测使用哪个构造函数?它会在哪里找到要传递给它的参数?即使它受到保护,您也需要这些东西的默认构造函数
-
如果你需要使用
XmlSerializer,那么你不能...这是这个序列化器的限制 -
@Jcl 我怀疑 any 序列化程序是否可以在不知道使用哪个构造函数的情况下以通用方式工作。
-
@PanagiotisKanavos 实际上有选项(例如 FormatterServices.GetUninitializedObject),但
XmlSerializer不使用它们 :-)BinaryFormatter确实使用它,例如。这绝对是有风险且不可取的,但可以做到 -
@Jcl 只是因为它序列化了整个实例,包括从未包含在 XML/Json 文件中的私有数据。
标签: c# deserialization