在 .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
响应?
有两个原因:
- 您的
ApiResponseModel<T>
没有无参数构造函数。
- 您正在使用
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()
我正在使用 .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
响应?
有两个原因:
- 您的
ApiResponseModel<T>
没有无参数构造函数。 - 您正在使用
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()