Как позаимствовать поле для сериализации, но создать его при десериализации? - PullRequest
0 голосов
/ 10 октября 2018

У меня есть такая структура:

#[derive(Serialize, Deserialize)]
struct Thing {
    pub small_header: Header,
    pub big_body: Body,
}

Я хочу сериализовать эту Thing для отправки по сети.У меня уже есть Body, но я не могу его переместить (представьте, что я что-то с ним делаю, и время от времени я получаю команду временно остановить то, что я делаю, и отправить егокакие бы данные у меня были сейчас) и я не могу скопировать их (это слишком много, возможно, сотни мегабайт).

Так что я бы хотел, чтобы Серде просто одолжил тот, который у меня есть длясериализовать его, поскольку для этого не нужно перемещать его в структуру.Если я переписываю Thing, чтобы получить ссылку, я, очевидно, не могу получить Deserialize!

Обходное решение, которое я использовал, просто использует Arc<Body> в моем коде, чтобы я мог работатьс телом в моей обычной логике, и когда мне нужно его сериализовать, я могу просто сделать дешевый клон и поместить Arc<Body> в структуру для сериализации.Во время десериализации Serde создаст новый Arc с повторным счетом 1.

Это все еще включает разбрасывание Arc по всему моему коду, что не очень хорошо, не говоря уже о ненужной (хотя и незначительной) среде выполненияСтоимость.Какое правильное решение для этого варианта использования?

Самое смешное, что если бы мне не нужно было отправлять заголовок, то это было бы не проблема, поскольку я мог бы сериализовать по ссылке и десериализовать по значению, но наличие заголовка делает это невозможным.Мне кажется, что я что-то упускаю из-за того, как Серде берет данные здесь ...

1 Ответ

0 голосов
/ 10 октября 2018

Вы можете использовать Cow, который будет Cow::Borrowed при сериализации и десериализоваться как Cow::Owned при десериализации.

use std::borrow::Cow;

#[derive(Serialize, Deserialize)]
struct Thing<'a> {
    small_header: Header,
    big_body: Cow<'a, Body>,
}

В качестве альтернативы, вы можете сериализовать идесериализовать как две независимые структуры данных.

#[derive(Serialize)]
struct SerializeThing<'a> {
    small_header: Header,
    big_body: &'a Body,
}

#[derive(Deserialize)]
struct DeserializeThing {
    small_header: Header,
    big_body: Body,
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...