将多个可枚举成员的序列化项目收集到同一父级
Collect serialized items of multiple enumerable members to a same parent
考虑以下 class:
[Serializable]
public class MyClass
{
[XmlAttribute("id")]
public int ID { get; set; }
[XmlArrayItem("User")]
public List<string> Users { get; set; }
[XmlArrayItem("Role")]
public List<string> Roles { get; set; }
}
现在我想转换 class 定义以获得以下 XML 序列化的预期结果 class:
<MyClass id="123">
<Access>
<User>User A</User>
<User>User B</User>
<User>User C</User>
<Role>Role A</Role>
<Role>Role B</Role>
<Role>Role C</Role>
</Access>
</MyClass>
而且它必须是可反序列化的。我尝试将 [Xml Array("Access")]
属性应用于 Users
和 Roles
属性,但出现了 InvalidOperationException
。
如果这个问题不用IXmlSerializable
实现就可以解决就好了。
看来您只需要制作一个 "Access" class 来嵌套您的 Users/Roles。
[XmlRoot(ElementName="Access")]
public class Access {
[XmlElement(ElementName="User")]
public List<string> User { get; set; }
[XmlElement(ElementName="Role")]
public List<string> Role { get; set; }
}
[XmlRoot(ElementName="MyClass")]
public class MyClass {
[XmlElement(ElementName="Access")]
public Access Access { get; set; }
[XmlAttribute(AttributeName="id")]
public string Id { get; set; }
}
考虑以下 class:
[Serializable]
public class MyClass
{
[XmlAttribute("id")]
public int ID { get; set; }
[XmlArrayItem("User")]
public List<string> Users { get; set; }
[XmlArrayItem("Role")]
public List<string> Roles { get; set; }
}
现在我想转换 class 定义以获得以下 XML 序列化的预期结果 class:
<MyClass id="123">
<Access>
<User>User A</User>
<User>User B</User>
<User>User C</User>
<Role>Role A</Role>
<Role>Role B</Role>
<Role>Role C</Role>
</Access>
</MyClass>
而且它必须是可反序列化的。我尝试将 [Xml Array("Access")]
属性应用于 Users
和 Roles
属性,但出现了 InvalidOperationException
。
如果这个问题不用IXmlSerializable
实现就可以解决就好了。
看来您只需要制作一个 "Access" class 来嵌套您的 Users/Roles。
[XmlRoot(ElementName="Access")]
public class Access {
[XmlElement(ElementName="User")]
public List<string> User { get; set; }
[XmlElement(ElementName="Role")]
public List<string> Role { get; set; }
}
[XmlRoot(ElementName="MyClass")]
public class MyClass {
[XmlElement(ElementName="Access")]
public Access Access { get; set; }
[XmlAttribute(AttributeName="id")]
public string Id { get; set; }
}