[英]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等),实现细节如何:
关于“许多序列化程序允许使用自定义序列化程序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.