【问题标题】:C# generate XML for non-serializable propertiesC# 为不可序列化的属性生成 XML
【发布时间】:2020-01-17 05:19:26
【问题描述】:

我有很多类希望导出为 XML 以供其他应用程序使用。我要导出的属性没有设置器,并且类没有没有属性的构造函数,因为我不希望在我的代码中出现这种行为。因此,我似乎无法对这些类和属性使用(XML)序列化,即使我确实想将其导出为 XML。不过我不需要反序列化,因为对 XML 的序列化是仅用于导出的。

我尝试过 XML 序列化,但它似乎只支持可以双向使用的类(序列化和反序列化),这使得我的类不适用。 https://docs.microsoft.com/en-us/dotnet/standard/serialization/introducing-xml-serialization

显然,我可以制作每个类的可序列化版本,但是手动执行此操作需要我在更新可序列化类的原始类的任何更新后手动检查。另外,我需要为每个类编写,转换的代码是它的可序列化版本。

有没有一种方法可以利用 XML 序列化的力量来处理所有关于 XML 的模糊问题,而不需要类可反序列化?或者您对导出这些类和属性的 XML 的简单方法有什么其他建议?

【问题讨论】:

    标签: c# .net xml-serialization


    【解决方案1】:

    有一个非常简单的指南适用于几乎每个序列化程序,无论格式(xml、json、protobuf 等)、实现细节等如何:

    • 如果您的类型模型恰好适合序列化程序,那就太好了!使用它!
    • 否则,不要尝试;创建一个完全独立的模型,纯粹用于序列化;形状和行为应该正是序列化程序需要得到你想要的结果;然后根据需要在两个模型(您的域模型和序列化模型)之间进行映射

    关于“许多序列化程序允许自定义序列化程序 API”有一个警告,但根据我的经验,通常不值得这样做,切换到单独的序列化模型是一个更好的主意.这尤其适用于XmlSerializer,因为IXmlSerializable几乎不可能完全正确地手动实现。

    所以;在这里要明确;如果问题是您的类型缺少正确的构造函数和属性设置器来使用XmlSerializer:创建一个拥有这些东西的新模型,然后在它们之间填充。

    【讨论】:

    • 感谢您的回复。虽然不理想,但我确实选择了这个解决方案。为 XML 序列化的每个类制作一个非常简单的副本,并使用 AutoMapper 轻松映射到这些类。主要缺点是我必须为每个类手动创建这样一个类,如果我向要导出的常规类添加属性,我还必须将该属性显式添加到可序列化类中。
    【解决方案2】:

    DataContractSerializer 可以在没有默认构造函数的情况下序列化类。

    您必须使用DataContractAttribute 标记班级才能这样做。此外,要序列化的属性需要设置器。 setter 可能是私有的,但 setter 必须存在:

    [DataContract] // Need this to serialize classes without default constructor.
    public class Person
    {
        public Person(string name, DateTime dob)
        {
            this.Name = name;
            this.DateOfBirth = dob;
        }
    
        [DataMember] // Need this to serialize this property
        public string Name { get; private set; } // Need setter for serializer to work
    
        [DataMember]
        public DateTime DateOfBirth { get; private set; }
    }
    

    用法:

    var person = new Person("Jesse de Wit", new DateTime(1988, 5, 27));
    var serializer = new DataContractSerializer(typeof(Person));
    using (var stream = new MemoryStream())
    {
        serializer.WriteObject(stream, person);
    }
    

    【讨论】:

    • 注意:DCS 没有像XmlSerializer 那样提供任何类似对xml 的控制——所以通常我会建议不要这样做,如果您的目标是专门生成 xml;如果您的目标只是“序列化这些数据,格式是一个实现细节”,那么它就变成了一个明确的可能
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多