将自定义文件类型字节流反序列化为.Net Core中的POCO对象

时间:2018-11-02 21:47:17

标签: c# .net-core deserialization

我需要从HttpPost调用中将自定义文件类型读入.Net Core应用程序。当前的路由代码如下:

using Microsoft.AspNetCore.Mvc;
using System;
using System.IO;
using System.Runtime.Serialization.Formatters.Binary;
using System.Threading.Tasks;

namespace Path.To.Controllers
{
    public class TransformationController : BaseController
    {
        public TransformationController()
        {
        }


        [Route("transform")]
        [Consumes("application/octet-stream")]
        [HttpPost]
        public async Task<IActionResult> Transform()
        {
            using (var ms = new MemoryStream(2048))
            {
                var formatter = new BinaryFormatter();
                await Request.Body.CopyToAsync(ms);
                ms.Seek(0, SeekOrigin.Begin);
                SomeType poco = null;

                try
                {
                    poco = (SomeType)formatter.Deserialize(ms);
                }
                catch (Exception e)
                {
                    return BadRequest(e);
                }


                return Ok(poco);
            }
        }
    }
}

但是,我从POST中收到以下错误: The input stream is not a valid binary format. The starting contents (in bytes) are: 43-54-30-30-31-20-20-20-20-20-20-20-20-20-20-20-20 ..."

来电:

POST /transform HTTP/1.1
Host: localhost:8080
Connection: keep-alive
Content-Length: 46848
Authorization: bearer REDACTED
Origin: http://localhost:9001
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.77 Safari/537.36
DNT: 1
Content-Type: application/octet-stream
Accept: */*
Referer: http://localhost:9001/iframe.html?
Accept-Encoding: gzip, deflate, br
Accept-Language: en-US,en;q=0.9

现在,我认为问题的根源在于字节流不包含C#进行转换的类型信息;它是C#进行转换所必需的。但是我不确定如何解决这个问题。

问题: 如何读取自定义文件类型?有没有一种方法可以不使用流,还是必须定义自己的解串器?如果没有,有没有一个例子可以让我知道我要怎么做?

1 个答案:

答案 0 :(得分:2)

  

我需要读取自定义文件类型

只要.NET中没有内置实现或没有实现您使用的特定文件类型的库,您就需要自己解析内容并根据定义自己解释二进制流的每个字节/部分自定义文件类型。

BinaryFormatter使用其自己的格式,因此您只能将由另一个BinaryFormatter生成的内容反序列化。同样,不能保证.NET中的二进制序列化可以在不同的框架实现中工作。因此,由.NET Framework生成的二进制内容不一定可以在.NET Core或Mono上使用。