Я хотел бы использовать Jackson для сериализации вывода из потока. У Jackson нет встроенной поддержки для сериализации java.util.stream.Stream
, но он способен сериализовать java.util.Iterator
.Сериализация Java 8 потоков
Чтобы проиллюстрировать эту проблему, я хотел бы сериализовать этот тривиальный интерфейс:
public interface SerializeMe {
Iterator<Integer> getMyNumbers();
}
я буду сравнения выходных от сериализации List.iterator()
vs. Stream.iterator()
:
public class SerializeViaList implements SerializeMe {
@Override
public Iterator<Integer> getMyNumbers() {
return Arrays.asList(1, 2, 3).iterator();
}
}
public class SerializeViaStream implements SerializeMe {
@Override
public Iterator<Integer> getMyNumbers() {
return Arrays.asList(1, 2, 3).stream().iterator();
}
}
Следующий метод продемонстрирует выход из этих двух классов:
public static void main(String[] args) throws Exception {
ObjectMapper mapper = new ObjectMapper();
System.out.println("via list: " + mapper.writeValueAsString(new SerializeViaList()));
System.out.println("via stream: " + mapper.writeValueAsString(new SerializeViaStream()));
}
Выход из этого является:
via list: {"myNumbers":[1,2,3]}
via stream: {"myNumbers":{}}
Это свидетельствует о том, что поток итератор не правильно сериализованная.
Интересно, что делает работу, если я добавить @JsonSerialize(as=Iterator.class)
:
@JsonSerialize(as=Iterator.class)
public Iterator<Integer> getMyNumbers() {
// ....
}
Я не хочу, чтобы написать пользовательский JsonSerializer
для каждого типа итератора, что поток может создать. Каковы мои альтернативы?
дубликата http://stackoverflow.com/questions/29103372/how-can-i-serialize-deserialize-java-util-stream-stream-using-jackson? –
Почему вы не применили '.collect (Collectors.toList());'? Вам нужно потоковое содержимое потока? –