【问题标题】:Deserialize without default constructor C# [duplicate]没有默认构造函数C#的反序列化[重复]
【发布时间】: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?

How to deserialize class without calling a constructor?

【问题讨论】:

  • 你不能。反序列化器应该如何猜测使用哪个构造函数?它会在哪里找到要传递给它的参数?即使它受到保护,您也需要这些东西的默认构造函数
  • 如果你需要使用XmlSerializer,那么你不能...这是这个序列化器的限制
  • @Jcl 我怀疑 any 序列化程序是否可以在不知道使用哪个构造函数的情况下以通用方式工作。
  • @PanagiotisKanavos 实际上有选项(例如 FormatterServices.GetUninitializedObject),但 XmlSerializer 不使用它们 :-) BinaryFormatter 确实使用它,例如。这绝对是有风险且不可取的,但可以做到
  • @Jcl 只是因为它序列化了整个实例,包括从未包含在 XML/Json 文件中的私有数据。

标签: c# deserialization


【解决方案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. 
    }
}

【讨论】:

  • 如果我没记错的话,内置反序列化的无参构造函数必须public
  • 请解释为什么这回答了 OP 的问题。仅代码的答案通常被认为是低质量的。鉴于 OP 要求没有默认构造函数的解决方案,您必须解释为什么您的解决方案引入默认构造函数
  • @ShekarGurram 请在问题本身中解释你想要什么。同时贴出相关代码。反序列化读取嵌套对象没有问题,那么您指的这个对象是什么?您可以添加默认构造函数吗?如果不是,为什么?
  • @Codor 不,它可以是私有的。
  • 导致No parameterless constructor defined for type of '[object]'.异常
猜你喜欢
  • 2018-08-18
  • 2013-11-05
  • 1970-01-01
  • 2020-05-19
  • 1970-01-01
  • 2015-07-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多