【问题标题】:XML cannot be serialized - parameterless constructor error, even with constructorXML 无法序列化 - 无参数构造函数错误,即使使用构造函数
【发布时间】:2020-02-20 08:30:10
【问题描述】:

我正在尝试使用 XmlSerializer 将对象序列化为 xml,但不断收到此错误:

System.InvalidOperationException: [MySql.Data.MySqlClient.MySqlParameter] cannot be serialized because it does not have a parameterless constructor.

我遵循why xml serializable class need a parameterless constructor 的解决方案,这似乎已经解决了其他所有人的问题,但我仍然收到错误。当我添加public MyClass() 时,它给了我'MyClass.MyClass()' must declare a body because it is not marked abstract, extern, or partial,所以我添加了一个正文,第一个错误又回来了。

请注意,最初没有任何构造函数,无论是无参数的还是其他的,所以我不明白为什么它不只是自动创建自己的。

我做错了什么?

已添加代码:

MyFile.cs

public async Task Save(MyClass xmlObj)
{
    XmlSerializer xmlSer = new XmlSerializer(this.GetType()); //I think the problem is likely to be here
    StringWriter strWriter = new StringWriter();

    xmlSer.Serialize(strWriter, xmlObj);
    objToUpdate.ColName = (strWriter.ToString());
    await dbContext.SaveChangesAsync();
}

文件.cs

public async Task<IActionResult> SaveData(params...)
{
    await new MyFile<MySqlParameter>(accessParam, dbContext).Save(xmlObj);
}

【问题讨论】:

  • 问题肯定是MySqlParameter 不能被序列化,而不是MyClass - 那么为什么要向MyClass 添加构造函数呢?你使用的是什么版本的MySql?因为MySqlParameter does have a parameterless constructor。您可以发布您的问题的可编译复制吗?
  • 为什么要尝试序列化MySqlParameter?那只是保存时发送到数据库的数据,它在父方法中,而不是XmlSerializer
  • 您是否尝试将您的构造函数更改为privateinternal
  • 是的,三个都试过了
  • Why would it be trying to serialise - 我不知道为什么,但错误消息清楚地表明它正在被序列化。您需要发布一些代码。

标签: c# xml-serialization


【解决方案1】:

你应该加了

public MyClass(){}

上课。没有主体和空主体之间是有区别的,这是您在此构造函数上想要的。

【讨论】:

  • 来自我的问题:所以我添加了一个正文,第一个错误又回来了 - 我已经尝试过了
  • 如@Matthew 所问,请发布您尝试序列化的类的代码,看起来您确实在尝试序列化不可序列化的对象
【解决方案2】:

我想通了……

我一直在创建一个新的 XmlSerializer 并传入一个参数,如 SO 答案中所发布的:

XmlSerializer xmlSer = new XmlSerializer(this.GetType());

如果真的使用相同的XmlSerializer 作为反序列化完全可以正常工作:

XmlSerializer objSer = new XmlSerializer(typeof(MyClass));

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-07-15
    • 1970-01-01
    相关资源
    最近更新 更多