c# - 在 C# 控制器中序列化 xml 请求
问题描述
假设我有这个用 c# 编码的类模式
public class Server
{
}
public class DataServer : Server
{
public string ip { get; set; }
public string name { get; set; }
public string dataBaseName { get; set; }
}
public class ImageServer : Server
{
public string ip { get; set; }
public string name { get; set; }
public int imageNumber { get; set; }
}
public class FeedServer : Server
{
public string ip { get; set; }
public string name { get; set; }
}
public class DataCenter
{
public Server serverA { get; set; }
public Server serverB { get; set; }
}
如果我在请求中得到这个 xml
<?xml version="1.0" encoding="UTF-8"?>
<DataCenter>
<ImageServer>
<ip>92.82.13.1</ip>
<name>image server</name>
<imageNumber>50</imageNumber>
</ImageServer>
<FeedServer>
<ip>82.25.87.7</ip>
<name>feed server</name>
</FeedServer>
</DataCenter>
这可以序列化到此类模式吗?我的课程需要什么 XMLroot、XMLattributes……?
如果我没有参考这些名称,我该如何区分应该去 serverA 和 serverB 的内容?
控制器代码
[HttpPost("CheckSlip")]
public async Task<bool> SaveServers([FromBody] DataCenter dataCenter)
{
// code
}
数据中心为空...我无法序列化它
解决方案
类结构和 XML 序列化属性必须反映 XML 才能正常工作。尝试手动创建这些类可能是一项相当耗时的任务。
我发现最简单的方法是让 Visual Studio 为您生成类。我在下面找到了一个可以在本地运行的快速示例。
第一的。复制要反序列化的 XML。然后在 Visual Studio 中添加一个新的空白类,然后选择 EDIT --> Paste Special --> Paste XML as Classes
这将在下面生成以下类
[System.Xml.Serialization.XmlTypeAttribute(AnonymousType = true)]
[System.Xml.Serialization.XmlRootAttribute(Namespace = "", IsNullable = false)]
public partial class DataCenter
{
private DataCenterImageServer imageServerField;
private DataCenterFeedServer feedServerField;
/// <remarks/>
public DataCenterImageServer ImageServer
{
get
{
return this.imageServerField;
}
set
{
this.imageServerField = value;
}
}
/// <remarks/>
public DataCenterFeedServer FeedServer
{
get
{
return this.feedServerField;
}
set
{
this.feedServerField = value;
}
}
}
/// <remarks/>
[System.Xml.Serialization.XmlTypeAttribute(AnonymousType = true)]
public partial class DataCenterImageServer
{
private string ipField;
private string nameField;
private byte imageNumberField;
/// <remarks/>
public string ip
{
get
{
return this.ipField;
}
set
{
this.ipField = value;
}
}
/// <remarks/>
public string name
{
get
{
return this.nameField;
}
set
{
this.nameField = value;
}
}
/// <remarks/>
public byte imageNumber
{
get
{
return this.imageNumberField;
}
set
{
this.imageNumberField = value;
}
}
}
/// <remarks/>
[System.Xml.Serialization.XmlTypeAttribute(AnonymousType = true)]
public partial class DataCenterFeedServer
{
private string ipField;
private string nameField;
/// <remarks/>
public string ip
{
get
{
return this.ipField;
}
set
{
this.ipField = value;
}
}
/// <remarks/>
public string name
{
get
{
return this.nameField;
}
set
{
this.nameField = value;
}
}
}
然后创建一个 XMLSerializer 的实例并反序列化 xml。对于这个例子,我将 XML 放在一个字符串 var 中。
var xml = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\r\n<DataCenter>\r\n <ImageServer>\r\n <ip>92.82.13.1</ip>\r\n <name>image server</name>\r\n <imageNumber>50</imageNumber>\r\n </ImageServer>\r\n <FeedServer>\r\n <ip>82.25.87.7</ip>\r\n <name>feed server</name>\r\n </FeedServer>\r\n</DataCenter>";
XmlSerializer s = new XmlSerializer(typeof(DataCenter));
using (var reader = new StringReader(xml))
{
var item = (DataCenter)s.Deserialize(reader);
}
您现在将拥有一个表示 XML 有效负载的对象。希望有帮助