gpt4 book ai didi

c# - 在可序列化的 C# 类上使用不带 XmlArray 的 XmlArrayItem 属性

转载 作者:IT王子 更新时间:2023-10-29 03:51:51 27 4
gpt4 key购买 nike

我想要以下格式的 XML:

<configuration><!-- Only one configuration node -->
<logging>...</logging><!-- Only one logging node -->
<credentials>...</credentials><!-- One or more credentials nodes -->
<credentials>...</credentials>
</configuration>

我正在尝试创建一个类 Configuration[Serializable]属性。要序列化凭据节点,我有以下内容:

[XmlArray("configuration")]
[XmlArrayItem("credentials", typeof(CredentialsSection))]
public List<CredentialsSection> Credentials { get; set; }

但是,当我将其序列化为 XML 时,XML 的格式如下:

<configuration>
<logging>...</logging>
<configuration><!-- Don't want credentials nodes nested in a second
configuration node -->
<credentials>...</credentials>
<credentials>...</credentials>
</configuration>
</configuration>

如果我删除 [XmlArray("configuration")]行,我得到以下信息:

<configuration>
<logging>...</logging>
<Credentials><!-- Don't want credentials nodes nested in Credentials node -->
<credentials>...</credentials>
<credentials>...</credentials>
</Credentials>
</configuration>

如何使用多个 <credentials> 以我想要的方式序列化它单个根节点内的节点 <configuration> ?我想这样做而不必实现 IXmlSerializable并进行自定义序列化。我的类(class)是这样描述的:

[Serializable]
[XmlRoot("configuration")]
public class Configuration : IEquatable<Configuration>

最佳答案

以下应该按照您想要的方式正确序列化。线索是 [XmlElement("credentials")] 在列表中。我通过获取您的 xml,在 Visual Studio 中从中生成一个模式 (xsd) 来做到这一点。然后在模式上运行 xsd.exe 以生成一个类。 (以及一些小的修改)

public class CredentialsSection
{
public string Username { get; set; }
public string Password { get; set; }
}

[XmlRoot(Namespace = "", IsNullable = false)]
public class configuration
{
/// <remarks/>
public string logging { get; set; }

/// <remarks/>
[XmlElement("credentials")]
public List<CredentialsSection> credentials { get; set; }

public string Serialize()
{
var credentialsSection = new CredentialsSection {Username = "a", Password = "b"};
this.credentials = new List<CredentialsSection> {credentialsSection, credentialsSection};
this.logging = "log this";
XmlSerializer s = new XmlSerializer(this.GetType());
StringBuilder sb = new StringBuilder();
TextWriter w = new StringWriter(sb);
s.Serialize(w, this);
w.Flush();
return sb.ToString();
}
}

给出以下输出

<?xml version="1.0" encoding="utf-16"?>
<configuration xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<logging>log this</logging>
<credentials>
<Username>a</Username>
<Password>b</Password>
</credentials>
<credentials>
<Username>a</Username>
<Password>b</Password>
</credentials>
</configuration>

关于c# - 在可序列化的 C# 类上使用不带 XmlArray 的 XmlArrayItem 属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3303165/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com