HttpClient不能正确序列化XML

在调用HttpClient的扩展方法PostAsXmlAsync ,它会忽略该类的XmlRootAttribute 。 这种行为是个错误吗?

测试

 [Serializable] [XmlRoot("record")] class Account { [XmlElement("account-id")] public int ID { get; set } } var client = new HttpClient(); await client.PostAsXmlAsync(url, new Account()) 

查看PostAsXmlAsync的源代码 ,我们可以看到它使用XmlMediaTypeFormatter ,它在内部使用DataContractSerializer不是 XmlSerializer 。 前者不尊重XmlRootAttribute

 public static Task PostAsXmlAsync(this HttpClient client, Uri requestUri, T value, CancellationToken cancellationToken) { return client.PostAsync(requestUri, value, new XmlMediaTypeFormatter(), cancellationToken); } 

为了实现您的需要,您可以创建自己的自定义扩展方法,该方法明确指定使用XmlSerializer

 public static class HttpExtensions { public static Task PostAsXmlWithSerializerAsync(this HttpClient client, Uri requestUri, T value, CancellationToken cancellationToken) { return client.PostAsync(requestUri, value, new XmlMediaTypeFormatter { UseXmlSerializer = true }, cancellationToken); } }