【问题标题】:Xml Serialization - System.InvalidOperationException: Is it not possible to serialize 'this'?Xml 序列化 - System.InvalidOperationException:不能序列化“this”吗?
【发布时间】:2019-02-28 14:15:17
【问题描述】:

希望这个问题不是太明显,但是我正在迈出序列化主题的第一步,但找不到以下行为的解释:

我想序列化一个类以测试我是否正确设置了所有内容。为此,我采用了the code from this tutorial 并对其进行了如下调整:

    private void SerializePresets(string path)
    {
        XmlSerializer xmlSerializer = new XmlSerializer(typeof(MyClass));
        using (TextWriter writer = new StreamWriter(path))
        {
            xmlSerializer.Serialize(writer, this);
        }
    }

此方法位于MyClass 中,也从那里调用。这给了我以下例外:

“System.InvalidOperationException”类型的异常发生在 System.Xml.dll 但未在用户代码中处理

附加信息:反映类型时出现错误 '我的班级'。

由于MyClass 首先将其他类对象作为属性,我想我也必须制作那些serializabel,但是异常仍然存在。 所以,我的猜测是,不可能序列化this,但是我找不到这个猜测的确认。

编辑:根据内部异常,此属性会导致问题:

[XmlArray("VolumePresetList"), XmlArrayItem(typeof(LinearAxisColorPresetsModel), ElementName = "VolumePresetList")]
public ObservableCollection<LinearAxisColorPresetsModel> VolumePresetList { get; set; }

【问题讨论】:

  • 你能添加你对MyClass的定义吗?
  • 看看内部异常了吗?
  • @spodger 我会试着把它贴在这里,但我必须先看看它并重命名一些东西,因为它是一个分类项目..
  • 问题是,只要MyClass 定义得当,您所尝试的一切都是完全可能的。
  • LinearAxisColorPresetsModel的定义是什么?

标签: c# serialization xml-serialization


【解决方案1】:

你可以使用它。它必须是不序列化的 Dictionary 等属性之一。请参阅下面的示例

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Xml;
using System.Xml.Linq;
using System.Xml.Serialization;
using System.IO;

namespace ConsoleApplication103
{
    class Program
    {

        const string FILENAME = @"c:\temp\test.xml";
        static void Main(string[] args)
        {
            MyClass myClass = new MyClass();
            myClass.Serialize(FILENAME);

        }
    }
    public class MyClass
    {
         public string test { get; set; }

         public void Serialize(string filename)
         {
             SerializePresets(filename);
         }
         private void SerializePresets(string path)
         {
             XmlSerializer xmlSerializer = new XmlSerializer(typeof(MyClass));
             using (TextWriter writer = new StreamWriter(path))
             {
                 xmlSerializer.Serialize(writer, this);
             }
        }
    }

}

【讨论】:

  • 有没有办法找出导致问题的属性?
  • 我通常会注释掉属性,直到找到导致问题的那个。我认为您的 StackTrace 异常消息不会有帮助,但您可以尝试。
【解决方案2】:

借助内部异常(再次感谢您的提示),我可以找出序列化失败的原因。

LinearAxisColorPresetsModel 类没有无参数构造函数,导致此问题。

只需添加

/// <summary>
/// Default Constructor
/// </summary>
private LinearAxisColorPresetsModel()
{

}

这门课为我解决了这个问题。剩下的就是找出原因,为什么我们必须有一个无参数的构造函数。

编辑:Found the reasoning behind this behaviour in this post.

【讨论】:

  • 有趣的是,C++ 的 Boost 序列化还需要类具有无参数构造函数。这是因为反序列化的工作方式与您添加的链接中描述的方式类似。我想这对于不是语言固有部分的序列化是必要的(C# 的 XML,C++ 的 Boost);作为一个库,它不知道对象如何在内存中布局,因此使用构造函数来创建它。至少在 C# 中,setter 可以做有用的事情。在 C++ 中没有设置器,因此必须手动调用反序列化后的工作;错误的余地...
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-03-23
  • 1970-01-01
  • 1970-01-01
  • 2011-05-12
  • 1970-01-01
  • 2011-06-24
相关资源
最近更新 更多