繁体   English   中英

C#为不可序列化的属性生成XML

[英]C# generate XML for non-serializable properties

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

我已经尝试过XML序列化,但是看来这确实只支持可以在两个方向上使用的类(序列化和反序列化),这使我的类不适用。 https://docs.microsoft.com/zh-cn/dotnet/standard/serialization/introducing-xml-serialization

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

有没有一种方法可以利用XML序列化的强度来处理所有有关XML的问题,而无需对类进行反序列化? 还是对于这些类和属性导出XML的简便方法还有其他建议吗?

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

  • 如果您的类型模型恰好适合串行器的1:1比例,那就太好了! 用它!
  • 否则, 不要尝试 创建一个完全独立的模型, 仅用于序列化 ; 形状和行为应该恰好是序列化程序获得所需结果所需的条件; 然后根据需要在两个模型(您的域模型和序列化模型)之间进行映射

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

所以; 在这里明确 如果问题是您的类型缺少与XmlSerializer一起XmlSerializer的正确的构造函数和属性设置器,则:创建一个包含这些东西的新模型,并在它们之间进行填充。

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

为此,您必须使用DataContractAttribute标记该类。 另外,要序列化的属性需要使用setter。 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);
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM