XmlSerialisation:将属性序列化为另一个属性的属性

Luc*_*key 2 c# serialization

给定一个可序列化的类,其中包含许多要序列化的属性,我希望它们中的一些属于另一个属性.

样品

序列化类似的类

[Serializeable]
public class MySerializeableClass {

    public string AnyPath { get; set; }

    public bool IsActive { get; set; }

}
Run Code Online (Sandbox Code Playgroud)

结果将是

<MySerializeableClass>
    <AnyPath>C:\</AnyPath>
    <IsActive>true</IsActive>
</MySerializeableClass>
Run Code Online (Sandbox Code Playgroud)

但它应该

<MySerializeableClass>
    <AnyPath IsActive="true">C:\</AnyPath>
</MySerializeableClass>
Run Code Online (Sandbox Code Playgroud)

要求

我在这里读过,我可以通过创建一些(通常是通用的)类来实现这一点.这会产生大量额外的代码,特别是因为序列化结构中没有可识别的顺序(它是一个定义的标准).意味着使它变得通用会使它比上面添加的链接更复杂 - 这就是为什么我要避免这种情况以及为什么我来到这里.

所以一般来说我正在寻找使用属性的解决方案.但我也对其他可能的解决方案持开放态度.

编辑:

只是为了澄清,我已经知道创建类来解决这个问题的可能性.我提出这个问题是因为我想避免这个,我不知道如何.

Gen*_*mer 7

你可以用其他一些类来做:

public class MyPathClass
{
    [XmlAttribute]
    public bool IsActive { get; set; }

    [XmlText]
    public string Value { get; set; }

    public static implicit operator string(MyPathClass value)
    {
        return value.Value;
    }

    public static implicit operator MyPathClass(string value)
    {
        return new MyPathClass { Value = value };
    }
}

public class MySerializeableClass
{
    [XmlElement]
    public MyPathClass AnyPath { get;set; }
}
Run Code Online (Sandbox Code Playgroud)

用法:

MySerializeableClass item = new MySerializeableClass() { AnyPath = "some path" };
Run Code Online (Sandbox Code Playgroud)

XML:

<?xml version="1.0"?>
<MySerializeableClass xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <AnyPath IsActive="false">some path</AnyPath>
</MySerializeableClass>
Run Code Online (Sandbox Code Playgroud)

获取路径(自动转换为字符串):

string path = item.AnyPath; // path="some path"
Run Code Online (Sandbox Code Playgroud)