【问题标题】:Serializing generic c# model to xml in .net core 3.0在.net core 3.0中将通用c#模型序列化为xml
【发布时间】:2019-11-08 15:14:19
【问题描述】:

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

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

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

在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;
    }
}

返回数据的动作:

[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);
}

虽然Accept 标头指定为application/xml,但此返回JSON 响应。

但如果我只是简单地返回 roleList,它会以XML 格式给出响应。

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

我怎样才能获得通用模型的XML 响应?

【问题讨论】:

    标签: asp.net-core asp.net-core-webapi asp.net-core-3.0


    【解决方案1】:

    有两个原因:

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

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

    公共类 ApiResponseModel { 公共 int 错误代码 { 获取;放; } 公共字符串错误消息 { 获取;放; } 公共 T 数据 { 获取;放; } public ApiResponseModel() { } // 添加无参数构造函数 public ApiResponseModel(int errorCode, string errorMessage, T data) { this.ErrorCode = errorCode; this.ErrorMessage = 错误消息; this.Data = 数据; } }

    并考虑添加一个 XML DataContractSerializer 格式化程序来处理 IEnumerable&lt;T&gt; 序列化:

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

    【讨论】:

    • 您的解决方案很有魅力。非常感谢。但是,通过包含模型的无参数构造函数如何解决这个问题?您能否简要介绍一下这一点或您如何指出确切的问题。提前致谢。
    • @Sunny12 我不像 Jon Skeet 那样可以在大脑中编译和运行代码的聪明人。所以我只是检查日志,日志告诉我应该有一个无参数的构造函数:)
    • 好的,那么忽略这些日志将是我的坏事。无论如何,谢谢。 @itminus
    猜你喜欢
    • 2021-04-25
    • 2021-12-03
    • 1970-01-01
    • 2019-12-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-17
    • 1970-01-01
    相关资源
    最近更新 更多