如何在没有无参数构造函数的情况下XML序列化对象?

时间:2013-09-03 20:07:03

标签: .net vb.net serialization xmlserializer

我正在尝试使用Visual Studios的“应用程序设置”功能轻松保存程序的设置。我尝试序列化的一个类包含来自MathNet.Numerics库的许多DenseMatrix对象。 DenseMatrix类没有无参数构造函数,因此在调用My.Settings.Save()时序列化会崩溃。我尝试用Double(,)替换矩阵,但也崩溃了。然后我尝试编写一些代码来包装DenseMatrix如下,但它也失败我猜测因为所有基类都必须有无参数构造函数,但我不确定。是否存在另一种逻辑方式来存储可由My.Settings.Save自动序列化的矩阵?

 <SettingsSerializeAs(SettingsSerializeAs.Xml)>
 Public Class AvtMatrix
    Inherits DenseMatrix
    Public Sub New()
       My.Base.New(3,3)
    End Sub
  End Class

1 个答案:

答案 0 :(得分:2)

深入研究一些IL,看起来它使用XmlSerializer - 在这种情况下,唯一的答案是:你不能 - 它需要一个公共的无参数构造函数。但可以欺骗一点 - [Obsolete];这有用,例如:

using System;
using System.IO;
using System.Xml.Serialization;
public class Foo
{
    public string Bar { get; set; }
    public Foo(string bar)
    {
        Bar = bar;
    }
    [Obsolete("You don't look like a serializer", true)]
    public Foo()
    {
    }
}
class Program
{
    static void Main()
    {
        var ser = new XmlSerializer(typeof(Foo));
        using (var ms = new MemoryStream())
        {
            ser.Serialize(ms, new Foo("abc"));
            ms.Position = 0;
            Foo clone = (Foo)ser.Deserialize(ms);
            Console.WriteLine(clone.Bar); // "abc"
        }
    }
}