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

C#为不可序列化的属性生成XML,c#,.net,xml-serialization,C#,.net,Xml Serialization,我有很多类希望导出为XML,供其他应用程序使用。我要导出的属性没有setter,类也没有没有没有属性的构造函数,因为我不希望代码中出现这种行为。因此,似乎我不能对这些类和属性使用(XML)序列化,即使我确实想将其导出为XML。不过,我不需要反序列化,因为对XML的序列化只用于导出 我已经尝试过XML序列化,但它似乎只支持可以双向使用的类(序列化和反序列化),这使得我的类不适用 显然,我可以为每个类创建可序列化的版本,但是手动执行此操作需要在更新了可序列化类的原始类之后手动检查。此外,我还需要为每

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

我已经尝试过XML序列化,但它似乎只支持可以双向使用的类(序列化和反序列化),这使得我的类不适用

显然,我可以为每个类创建可序列化的版本,但是手动执行此操作需要在更新了可序列化类的原始类之后手动检查。此外,我还需要为每个类编写代码,要转换的代码是其可序列化版本


有没有一种方法可以利用XML序列化的强大功能来处理XML的所有模糊性,而不需要反序列化类?或者,对于为这些类和属性导出XML的简单方法,您还有其他建议吗?

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

  • 如果您的类型模型恰好适合序列化程序,那就太好了!用它
  • 否则,不要尝试;创建一个完全独立的模型,纯粹用于序列化;形状和行为应该正好是序列化程序获得所需结果所需的;然后根据需要在两个模型(域模型和序列化模型)之间映射
关于“许多序列化程序允许自定义序列化程序API”有一个警告,但根据我的经验,这通常是不值得的,切换到单独的序列化模型是一个更好的主意。这尤其适用于
XmlSerializer
,因为
IXmlSerializable
几乎不可能完全正确地手动实现


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

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

  • 如果您的类型模型恰好适合序列化程序,那就太好了!用它
  • 否则,不要尝试;创建一个完全独立的模型,纯粹用于序列化;形状和行为应该正好是序列化程序获得所需结果所需的;然后根据需要在两个模型(域模型和序列化模型)之间映射
关于“许多序列化程序允许自定义序列化程序API”有一个警告,但根据我的经验,这通常是不值得的,切换到单独的序列化模型是一个更好的主意。这尤其适用于
XmlSerializer
,因为
IXmlSerializable
几乎不可能完全正确地手动实现

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

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

要这样做,你必须在课堂上打上标记。此外,要序列化的属性需要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);
}
可以在没有默认构造函数的情况下序列化类

要这样做,你必须在课堂上打上标记。此外,要序列化的属性需要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);
}

谢谢你的回复。虽然不理想,但我还是选择了这个解决方案。为XML序列化制作每个类的一个非常简单的副本,并使用AutoMapper轻松映射到这些类。主要的缺点是我必须为每个类手动创建这样的类,如果我将属性添加到要导出的常规类中,我还必须将该属性显式地添加到可序列化类中。感谢您的回复。虽然不理想,但我还是选择了这个解决方案。为XML序列化制作每个类的一个非常简单的副本,并使用AutoMapper轻松映射到这些类。主要缺点是我必须为每个类手动创建这样一个类,如果我向要导出的常规类添加属性,我还必须将该属性显式地添加到serializable类中。注意:DCS对xml的控制不如
XmlSerializer
——因此,如果您的目标是生成xml,我通常会建议您不要使用它;如果您的目标只是“序列化此数据,格式是一个实现细节”,那么它就成了一个明确的问题。注意:DCS对xml的控制不如
XmlSerializer
——因此,如果您的目标是专门生成xml,我通常会建议您不要这样做;如果您的目标只是“序列化此数据,格式是一个实现细节”,那么它将成为一个明确的目标