Как выполнить двоичную сериализацию и десериализацию, используя asp. net web api, swagger и nswag studio - PullRequest
0 голосов
/ 11 марта 2020

Я использую C# ASP. NET веб-API с фреймворком 4.7.2 (пока нет ядра из-за устаревших причин) с swagger, и у меня есть объект CameraFrame, который я хочу иметь возможность выставлять через веб api.

Если я обычно выставляю CameraFrame, он преобразуется в json и обратно. Это ужасно медленно из-за размера массива байтов. Поэтому я хотел бы отправить объект в виде двоичного сериализованного объекта.

Однако, если я делаю это, то объект CameraFrame отсутствует в моделях сваггера, а также, когда я генерирую клиента с помощью NSwagStudio, он также не генерирует контракт для объекта.

Как я могу отправить объект CameraFrame в двоичном формате и затем десериализовать / реконструировать объект на стороне клиента, предпочтительно сгенерированный с помощью NSwagStudio, как мы делаем в настоящее время для webapi? Или, если через NSwagStudio это невозможно, то как мне сделать это вручную?

Объект, который я должен выставить sh:

[Serializable]
public class CameraFrame
{
    public CameraFrame(long frameNumber, int width, int height, int stride, byte[] image, double position = double.NaN)
    {
        FrameNumber = frameNumber;
        Width = width;
        Height = height;
        Stride = stride;
        Position = position;
        Image = image;
    }

    public long FrameNumber { get; }
    public double Position { get; set; }

    public byte[] Image { get; set; }
    public int Width { get; }
    public int Height { get; }
    public int Stride { get; }

    public int BytesPerPixel => Width > 0 ? Stride / Width : 0;
}

Контроллер:

public class CameraController : ApiController
{
...
        [Route("api/v1/camera/buffer/{frameNumber}")]
        [HttpGet]
        public HttpResponseMessage GetFrame(long frameNumber)
        {
            return dataProviderService.Get(frameNumber).ConvertCameraFrameToMimeResponseMessage(); ;
        }
...
}

Конвертер:

public static HttpResponseMessage ConvertCameraFrameToMimeResponseMessage(this CameraFrame image)
{

    var result = new HttpResponseMessage(HttpStatusCode.OK);

    BinaryFormatter bf = new BinaryFormatter();
    using (var ms = new MemoryStream())
    {
        bf.Serialize(ms, image);
        result.Content = new ByteArrayContent(ms.ToArray());
    }

    result.Content.Headers.ContentType = new MediaTypeHeaderValue("application/octet-stream");
    return result;
}

Запуск:

public class Startup
{
    public void Configuration(IAppBuilder app)
    {
        var versionInfo = FileVersionInfo.GetVersionInfo(Assembly.GetExecutingAssembly().Location);

        app.MapSignalR();

        // Setup Swagger
        app.UseSwaggerUi3(typeof(Startup).Assembly, settings =>
        {
            settings.DocumentPath = "/docs/v1/swagger.json";
            settings.Path = "/docs";
            settings.GeneratorSettings.DefaultUrlTemplate = "api/v1/{controller}/{id}";

            settings.PostProcess = document =>
            {
                document.Info.Title = "....";
                document.Info.Description = "....";
                document.Info.Version = versionInfo.FileVersion;
            };
        });
    }
}
...