Бережливая (де) сериализация списка

1

В Thrift, в контексте вызова метода в службе, списки могут использоваться непосредственно в качестве аргументов или типа возврата. Если вам нужна явная сериализация объектов (de), есть ли удобный способ (в Java) использовать Thrift для (de) сериализации List <TBase> без необходимости обертывать это как отдельную структуру в ИЛЛ бережливости?

Конкретнее, предположим, что я определил в бережливости

struct A {
    1: required long x;
    2: required long y;
}

Я могу (де) сериализовать список из них, определив

struct ListOfA {
    1: required list<A> theList;
}

а потом

ListOfA myList = ...
TSerializer serializer = new TSerializer();
byte[] mySerializedList = serializer.serialize(myList);

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

Следующее не работает как TSerializer.serialize ожидает TBase

List<A> myList = ...   // List<A> instead of ListOfA
TSerializer serializer = new TSerializer();
byte[] mySerializedList = serializer.serialize(myList); //does not compile

Использование typedef в IDL уже поможет, но они не переведены в Java-класс, кажется

typedef list<A> ListOfA

=> ListOfA не определен в сгенерированном Java-коде.

  • 0
    Если вы считаете, что нашли ошибку, вы можете подать заявку в JIRA, включая тестовый пример.
Теги:
serialization
thrift

1 ответ

1

Мой вопрос заключается в том, можно ли избежать этого (слегка неэлегантного) определения дополнительной структуры только для того, чтобы содержать список

Я бы рекомендовал обратное: выполните "неэффективный" шаг использования структуры wrapping.

Thrift допускает произвольное количество входных аргументов. Однако может быть только одно возвращаемое значение. Нет таких параметров, как параметры var или out или несколько возвращаемых значений, поэтому вы действительно ограничены максимум одним возвращаемым значением для возврата любых данных, которые вам нужно вернуть.

Второй аспект, который входит в игру, - мягкое исполнение. Thrift позволяет впоследствии улучшить интерфейсы и структуры данных, не нарушая работу старых служб или клиентов. Если вы решите сделать это

struct Bar { /*some data*/ }

service Foo {
    list<Bar> GiveMeTheData()
}

вы по существу отрезаете себя от этого механизма. Потому что возвращенный list<Bar> не может быть расширен с новыми дополнительными членами. В этом случае вам придется добавить еще один звонок.

В отличие от этого, используя struct обертывания, распространение возвращаемых данных легко возможно, а цена для оплаты не такая высокая:

struct Bar { /*some data*/ }

struct FooResult { 
  1: list<Bar>   list
  // new members here
}

service Foo {
    FooResult GiveMeTheData()
}

Кроме того, последний также позволяет вернуть список NULL, что было бы невозможно с первой компоновкой.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню