在 .net core 3.0 中将通用 c# 模型序列化为 xml

Serializing generic c# model to xml in .net core 3.0

我正在使用 .net core 3.0 创建 Web API。我想将通用模型序列化为 XML。但默认情况下,它仅将通用模型序列化为 JSON

当我尝试将一个简单模型序列化为 XML 时,它被正确地序列化为 XML

根据传递的 headers,我想序列化模型。这是我到目前为止所做的:

在 startup.cs 文件中:

services.AddControllers(options =>{
        options.RespectBrowserAcceptHeader = true; // false by default
    }).
    AddXmlSerializerFormatters().

代码示例如下:

我的通用模型:

public class ApiResponseModel<T>
{
    public int ErrorCode { get; set; }
    public string ErrorMessage { get; set; }
    public T Data { get; set; }

    public ApiResponseModel(int errorCode, string errorMessage, T data)
    {
        this.ErrorCode = errorCode;
        this.ErrorMessage = errorMessage;
        this.Data = data;
    }
}

对 return 数据的操作:

[HttpGet]
public async Task<IActionResult> Get()
{
    IEnumerable<RoleDTO> roleList = null;
    roleList = await _repository.RoleRepository.GetAllRolesAsync();
    var data = new ApiResponseModel<IEnumerable<RoleDTO>>(200, "Success", roleList);
    return Ok(data);
}

此 return JSON 响应虽然 Accept header 指定为 application/xml.

但如果我只是 return roleList,它会以 XML 格式给出响应。

[HttpGet]
public async Task<IActionResult> Get()
{
    IEnumerable<RoleDTO> roleList = null;
    roleList = await _repository.RoleRepository.GetAllRolesAsync();
    return Ok(roleList);
} 

如何获得通用模型的 XML 响应?

有两个原因:

  1. 您的 ApiResponseModel<T> 没有无参数构造函数。
  2. 您正在使用 AddXmlSerializerFormatters()XmlSerializer(而不是 XML DataContractSerializer),默认情况下它不会处理 IEnumerable<T> 序列化。

要解决此问题,请添加无参数构造函数:

public class ApiResponseModel<T>
{
    public int ErrorCode { get; set; }
    public string ErrorMessage { get; set; }
    public T Data { get; set; }
    public ApiResponseModel() { }       // add a parameterless constructor

    public ApiResponseModel(int errorCode, string errorMessage, T data)
    {
        this.ErrorCode = errorCode;
        this.ErrorMessage = errorMessage;
        this.Data = data;
    }
}

并考虑添加 XML DataContractSerializer 格式化程序来处理 IEnumerable<T> 序列化:

services.AddControllersWithViews(opts =>{
    opts.RespectBrowserAcceptHeader = true;
})
.AddXmlDataContractSerializerFormatters()
.AddXmlSerializerFormatters()