【问题标题】:How do I XML Serialize a object without a parameter-less constructor?如何在没有无参数构造函数的情况下对对象进行 XML 序列化?
【发布时间】:2013-09-07 04:19:04
【问题描述】:

我正在尝试使用 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

【问题讨论】:

    标签: .net vb.net serialization xmlserializer


    【解决方案1】:

    深入研究一些 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"
            }
        }
    }
    

    【讨论】:

    • 您只是在使用 Obsolete 告诉最终用户不要调用无参数构造函数,对吗?这里没有办法使用这个技巧来正确包装 DenseVector 类,因为我无权访问该代码,并且仅继承和添加无参数构造函数似乎不起作用。
    • @AlexanderVanAtta 实际上,[Obsolete] 阻止人们通过 C# 编译器使用该构造函数。如果您无权访问该类型,那么坦率地说,尝试像这样对其进行序列化是一个糟糕的选择。我建议使用简单的 DTO 进行序列化。
    猜你喜欢
    • 2011-04-03
    • 2010-10-10
    • 2015-09-13
    • 2013-10-22
    • 1970-01-01
    • 2011-11-03
    • 2018-04-05
    • 1970-01-01
    • 2015-08-14
    相关资源
    最近更新 更多