Hi Matthias, Indeed, you are right. I missed your email, I had a problem with my mail server, so I guess I didn’t receive it.
1) Here is what I came up with In my ListSerializer.java I have the following: try (final DataOutputStream out = new DataOutputStream(baos)) { // I’m encoding the class name at the top of the byte array out.writeUTF(data.getClass().getCanonicalName()); out.writeInt(size); for (T entry : data) { final byte[] bytes = serializer.serialize(topic, entry); out.writeInt(bytes.length); out.write(bytes); } return baos.toByteArray(); } Then in ListDeserializer.java: try (final DataInputStream dis = new DataInputStream(new ByteArrayInputStream(data))) { final String listClassName = dis.readUTF(); final int size = dis.readInt(); List<T> deserializedList = getListInstance(listClassName, size); for (int i = 0; i < size; i++) { byte[] payload = new byte[dis.readInt()]; dis.read(payload); deserializedList.add(deserializer.deserialize(topic, payload)); } return deserializedList; } private List<T> getListInstance(String listClassName, int listSize) { try { Class<?> listClass = Class.forName(listClassName); Constructor<?> listConstructor = listClass.getConstructor(Integer.TYPE); return (List<T>) listConstructor.newInstance(listSize); } catch (Exception e) { throw new RuntimeException("Could not construct a list instance of \"" + listClassName + "\"", e); } } It works just fine, except for one edge case. If you try to pass Arrays.asList(...) to the (de)serializer which is ArrayList instance, it will throw: java.lang.ClassNotFoundException: java.util.Arrays.ArrayList Because it is expecting java.util.ArrayList. The problem is described here: https://stackoverflow.com/questions/28851652/java-lang-classcastexception-java-util-arraysarraylist-cannot-be-cast-to-java Arrays.asList() produces an instance of a List implementation (java.util.Arrays$ArrayList) that is not java.util.ArrayList What do you think of this? Based on your experience, what is the best approach in this case? Maybe we modify a String? Is there any other cases where similar problem happens? Still working on (2) Thank you Matthias! Best, Daniyar Yeralin > On Jun 11, 2019, at 6:05 PM, Matthias J. Sax <matth...@confluent.io> wrote: > > Seems you missed my reply from 31/6. C&P below: > >> (1) The current PR suggests to always instantiate an `ArrayList` -- >> however, if a user wants to use any other list implementation, they have >> no way to specify this. It might be good to either allow users to >> specify the list-type on the deserializer, or encode the list type >> directly in the bytes, and hence, whatever type the serialized list was, >> the same type will be used on deserialization (might only work for Java >> build-it list types). >> >> Personally, I thinks its better/more flexible to specify the list-type >> on the deserializer, as it also allows to plug-in any custom list types. >> >> This could of course be opt-in and for the case users don't care, we >> just default to `ArrayList`. >> >> >> (2) For Java built-in types, we could check the type via `instanceof` -- >> if the type is unknown, we fall back to per-element length encoding. As >> an alternative, we could also add a constructor taking an `enum` with >> two values `fixed-size` and `variable-size`, or a config instead of a >> constructor element. >> >> >> Just bounding off ideas -- maybe there are good reasons (too >> complicated?) to not support either of them. >> > > > -Matthias > > On 6/10/19 8:44 AM, Development wrote: >> Bump >> >>> On May 24, 2019, at 2:09 PM, Development <d...@yeralin.net> wrote: >>> >>> Hey, >>> >>> - did we consider to make the return type (ie, ArrayList, vs >>> LinkesList) configurable or encode it the serialized bytes? >>> >>> Not sure about this one. Could you elaborate? >>> >>> - atm the size of each element is encoded individually; did we consider >>> an optimization for fixed size elements (like Long) to avoid this overhead? >>> >>> I cannot think of any clean way to do so. How would you see it? >>> >>> Btw I resolved all your comments under PR >>> >>> Best, >>> Daniyar Yeralin >>> >>>> On May 24, 2019, at 12:01 AM, Matthias J. Sax <matth...@confluent.io> >>>> wrote: >>>> >>>> Thanks for the KIP. I also had a look into the PR and have two follow up >>>> question: >>>> >>>> >>>> - did we consider to make the return type (ie, ArrayList, vs >>>> LinkesList) configurable or encode it the serialized bytes? >>>> >>>> - atm the size of each element is encoded individually; did we consider >>>> an optimization for fixed size elements (like Long) to avoid this overhead? >>>> >>>> >>>> >>>> -Matthias >>>> >>>> On 5/15/19 6:05 PM, John Roesler wrote: >>>>> Sounds good! >>>>> >>>>> On Tue, May 14, 2019 at 9:21 AM Development <d...@yeralin.net> wrote: >>>>>> >>>>>> Hey, >>>>>> >>>>>> I think it the proposal is finalized, no one raised any concerns. Shall >>>>>> we call it for a [VOTE]? >>>>>> >>>>>> Best, >>>>>> Daniyar Yeralin >>>>>> >>>>>>> On May 10, 2019, at 10:17 AM, John Roesler <j...@confluent.io> wrote: >>>>>>> >>>>>>> Good observation, Daniyar. >>>>>>> >>>>>>> Maybe we should just not implement support for serdeFrom. >>>>>>> >>>>>>> We can always add it later, but I think you're right, we need some >>>>>>> kind of more sophisticated support, or at least a second argument for >>>>>>> the inner class. >>>>>>> >>>>>>> For now, it seems like most use cases would be satisfied without >>>>>>> serdeFrom(...List...) >>>>>>> >>>>>>> -John >>>>>>> >>>>>>> On Fri, May 10, 2019 at 8:57 AM Development <d...@yeralin.net> wrote: >>>>>>>> >>>>>>>> Hi, >>>>>>>> >>>>>>>> I was trying to add some test cases for the list serde, and it led me >>>>>>>> to this class >>>>>>>> `org.apache.kafka.common.serialization.SerializationTest`. I saw that >>>>>>>> it relies on method >>>>>>>> `org.apache.kafka.common.serialization.serdeFrom(Class<T> type)` >>>>>>>> >>>>>>>> Now, I’m not sure how to adapt List<T> serde for this method, since it >>>>>>>> will be a “nested class”. What is the best approach in this case? >>>>>>>> >>>>>>>> I remember that in Jackson for example, one uses a TypeFactory, and >>>>>>>> constructs “collectionType” of two classes. For example, >>>>>>>> `constructCollectionType(List.class, String.class).getClass()`. I >>>>>>>> don’t think it applies here. >>>>>>>> >>>>>>>> Any ideas? >>>>>>>> >>>>>>>> Best, >>>>>>>> Daniyar Yeralin >>>>>>>> >>>>>>>>> On May 9, 2019, at 2:10 PM, Development <d...@yeralin.net> wrote: >>>>>>>>> >>>>>>>>> Hey Sophie, >>>>>>>>> >>>>>>>>> Thank you for your input. I think I’d rather finish this KIP as is, >>>>>>>>> and then open a new one for the Collections (if everyone agrees). I >>>>>>>>> don’t want to extend the current KIP-466, since most of the work is >>>>>>>>> already done for it. >>>>>>>>> >>>>>>>>> Meanwhile, I’ll start adding some test cases for this new list serde >>>>>>>>> since this discussion seems to be approaching its logical end. >>>>>>>>> >>>>>>>>> Best, >>>>>>>>> Daniyar Yeralin >>>>>>>>> >>>>>>>>>> On May 9, 2019, at 1:35 PM, Sophie Blee-Goldman >>>>>>>>>> <sop...@confluent.io> wrote: >>>>>>>>>> >>>>>>>>>> Good point about serdes for other Collections. On the one hand I'd >>>>>>>>>> guess >>>>>>>>>> that non-List Collections are probably relatively rare in practice >>>>>>>>>> (if >>>>>>>>>> anyone disagrees please correct me!) but on the other hand, a) even >>>>>>>>>> if just >>>>>>>>>> a small number of people benefit I think it's worth the extra effort >>>>>>>>>> and b) >>>>>>>>>> if we do end up needing/wanting them in the future it would save us >>>>>>>>>> a KIP >>>>>>>>>> to just add them now. Personally I feel it would make sense to >>>>>>>>>> expand the >>>>>>>>>> scope of this KIP a bit to include all Collections as a logical >>>>>>>>>> unit, but >>>>>>>>>> the ROI could be low.. >>>>>>>>>> >>>>>>>>>> (I know of at least one instance in the unit tests where a Set serde >>>>>>>>>> could >>>>>>>>>> be useful, and there may be more) >>>>>>>>>> >>>>>>>>>> On Thu, May 9, 2019 at 7:27 AM Development <d...@yeralin.net> wrote: >>>>>>>>>> >>>>>>>>>>> Hey, >>>>>>>>>>> >>>>>>>>>>> I don’t see any replies. Seems like this proposal can be finalized >>>>>>>>>>> and >>>>>>>>>>> called for a vote? >>>>>>>>>>> >>>>>>>>>>> Also I’ve been thinking. Do we need more serdes for other >>>>>>>>>>> Collections? >>>>>>>>>>> Like queue or set for example >>>>>>>>>>> >>>>>>>>>>> Best, >>>>>>>>>>> Daniyar Yeralin >>>>>>>>>>> >>>>>>>>>>>> On May 8, 2019, at 2:28 PM, John Roesler <j...@confluent.io> wrote: >>>>>>>>>>>> >>>>>>>>>>>> Hi Daniyar, >>>>>>>>>>>> >>>>>>>>>>>> No worries about the procedural stuff. Prior experience with KIPs >>>>>>>>>>>> is >>>>>>>>>>>> not required :) >>>>>>>>>>>> >>>>>>>>>>>> I was just trying to help you propose this stuff in a way that the >>>>>>>>>>>> others will find easy to review. >>>>>>>>>>>> >>>>>>>>>>>> Thanks for updating the KIP. Thanks to the others for helping out >>>>>>>>>>>> with >>>>>>>>>>>> the syntax. >>>>>>>>>>>> >>>>>>>>>>>> Given these updates, I'm curious if anyone else has feedback about >>>>>>>>>>>> this proposal. Personally, I think it sounds fine! >>>>>>>>>>>> >>>>>>>>>>>> -John >>>>>>>>>>>> >>>>>>>>>>>> On Wed, May 8, 2019 at 1:01 PM Development <d...@yeralin.net> >>>>>>>>>>>> wrote: >>>>>>>>>>>>> >>>>>>>>>>>>> Hey, >>>>>>>>>>>>> >>>>>>>>>>>>> That worked! I certainly lack Java generics knowledge. Thanks for >>>>>>>>>>>>> the >>>>>>>>>>> snippet. I’ll update KIP again. >>>>>>>>>>>>> >>>>>>>>>>>>> Best, >>>>>>>>>>>>> Daniyar Yeralin >>>>>>>>>>>>> >>>>>>>>>>>>>> On May 8, 2019, at 1:39 PM, Chris Egerton <chr...@confluent.io> >>>>>>>>>>>>>> wrote: >>>>>>>>>>>>>> >>>>>>>>>>>>>> Hi Daniyar, >>>>>>>>>>>>>> >>>>>>>>>>>>>> I think you may want to tweak your syntax a little: >>>>>>>>>>>>>> >>>>>>>>>>>>>> public static <T> Serde<List<T>> List(Serde<T> innerSerde) { >>>>>>>>>>>>>> return new ListSerde<T>(innerSerde); >>>>>>>>>>>>>> } >>>>>>>>>>>>>> >>>>>>>>>>>>>> Does that work? >>>>>>>>>>>>>> >>>>>>>>>>>>>> Cheers, >>>>>>>>>>>>>> >>>>>>>>>>>>>> Chris >>>>>>>>>>>>>> >>>>>>>>>>>>>> On Wed, May 8, 2019 at 10:29 AM Development <d...@yeralin.net >>>>>>>>>>>>>> <mailto: >>>>>>>>>>> d...@yeralin.net>> wrote: >>>>>>>>>>>>>> Hi John, >>>>>>>>>>>>>> >>>>>>>>>>>>>> I updated JIRA and KIP. >>>>>>>>>>>>>> >>>>>>>>>>>>>> I didn’t know about the process, and created PR before I knew >>>>>>>>>>>>>> about >>>>>>>>>>> KIPs :) >>>>>>>>>>>>>> >>>>>>>>>>>>>> As per static declaration, I don’t think Java allows that: >>>>>>>>>>>>>> >>>>>>>>>>>>>> >>>>>>>>>>>>>> Best, >>>>>>>>>>>>>> Daniyar Yeralin >>>>>>>>>>>>>> >>>>>>>>>>>>>>> On May 7, 2019, at 2:22 PM, John Roesler <j...@confluent.io >>>>>>>>>>>>>>> <mailto: >>>>>>>>>>> j...@confluent.io>> wrote: >>>>>>>>>>>>>>> >>>>>>>>>>>>>>> Thanks for that update. Do you mind making changes primarily on >>>>>>>>>>>>>>> the >>>>>>>>>>>>>>> KIP document ? ( >>>>>>>>>>> https://cwiki.apache.org/confluence/display/KAFKA/KIP-466%3A+Add+support+for+List%3CT%3E+serialization+and+deserialization >>>>>>>>>>> < >>>>>>>>>>> https://cwiki.apache.org/confluence/display/KAFKA/KIP-466%3A+Add+support+for+List%3CT%3E+serialization+and+deserialization >>>>>>>>>>>> ) >>>>>>>>>>>>>>> >>>>>>>>>>>>>>> This is the design document that we have to agree on and vote >>>>>>>>>>>>>>> for, the >>>>>>>>>>>>>>> PR comes later. It can be nice to have an implementation to >>>>>>>>>>>>>>> look at, >>>>>>>>>>>>>>> but the KIP is the main artifact for this discussion. >>>>>>>>>>>>>>> >>>>>>>>>>>>>>> With this in mind, it will help get more reviewers to look at >>>>>>>>>>>>>>> it if >>>>>>>>>>>>>>> you can tidy up the KIP document so that it stands on its own. >>>>>>>>>>>>>>> People >>>>>>>>>>>>>>> shouldn't have to look at any other document to understand the >>>>>>>>>>>>>>> motivation of the proposal, and they shouldn't have to look at >>>>>>>>>>>>>>> a PR to >>>>>>>>>>>>>>> see what the public API will look like. If it helps, you can >>>>>>>>>>>>>>> take a >>>>>>>>>>>>>>> look at some other recent KIPs. >>>>>>>>>>>>>>> >>>>>>>>>>>>>>> Given that the list serde needs an inner serde, I agree you >>>>>>>>>>>>>>> can't have >>>>>>>>>>>>>>> a zero-argument static factory method for it, but it seems you >>>>>>>>>>>>>>> could >>>>>>>>>>>>>>> still have a static method: >>>>>>>>>>>>>>> `public static Serde<List<T>> List(Serde<T> innerSerde)`. >>>>>>>>>>>>>>> >>>>>>>>>>>>>>> Thoughts? >>>>>>>>>>>>>>> >>>>>>>>>>>>>>> On Tue, May 7, 2019 at 12:18 PM Development <d...@yeralin.net >>>>>>>>>>>>>>> <mailto: >>>>>>>>>>> d...@yeralin.net>> wrote: >>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>> Absolutely agree. Already pushed another commit to remove >>>>>>>>>>>>>>>> comparator >>>>>>>>>>> argument: https://github.com/apache/kafka/pull/6592 < >>>>>>>>>>> https://github.com/apache/kafka/pull/6592> < >>>>>>>>>>> https://github.com/apache/kafka/pull/6592 < >>>>>>>>>>> https://github.com/apache/kafka/pull/6592>> >>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>> Thank you for your input John! I really appreciate it. >>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>> What about this point I made: >>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>> 1. Since type for List serde needs to be declared before hand, >>>>>>>>>>>>>>>> I >>>>>>>>>>> could not create a static method for List Serde under >>>>>>>>>>> org.apache.kafka.common.serialization.Serdes. I addressed it in the >>>>>>>>>>> KIP: >>>>>>>>>>>>>>>> P.S. Static method corresponding to ListSerde under >>>>>>>>>>> org.apache.kafka.common.serialization.Serdes (something like static >>>>>>>>>>> public >>>>>>>>>>> Serde<List<T>> List() {...} >>>>>>>>>>> inorg.apache.kafka.common.serialization.Serdes) >>>>>>>>>>> class cannot be added because type needs to be defined beforehand. >>>>>>>>>>> That's >>>>>>>>>>> why one needs to create List Serde in the following fashion: >>>>>>>>>>>>>>>> new Serdes.ListSerde<String>(Serdes.String(), >>>>>>>>>>> Comparator.comparing(String::length)); >>>>>>>>>>>>>>>> (can possibly be simplified by declaring import static >>>>>>>>>>> org.apache.kafka.common.serialization.Serdes.ListSerde) >>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>> On May 7, 2019, at 11:50 AM, John Roesler <j...@confluent.io >>>>>>>>>>> <mailto:j...@confluent.io>> wrote: >>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>> Thanks for the reply Daniyar, >>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>> That makes much more sense! I thought I must be missing >>>>>>>>>>>>>>>>> something, >>>>>>>>>>> but I >>>>>>>>>>>>>>>>> couldn't for the life of me figure it out. >>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>> What do you think about just taking an argument, instead of >>>>>>>>>>>>>>>>> for a >>>>>>>>>>>>>>>>> Comparator, for the Serde of the inner type? That way, the >>>>>>>>>>>>>>>>> user can >>>>>>>>>>> control >>>>>>>>>>>>>>>>> how exactly the inner data gets serialized, while also >>>>>>>>>>>>>>>>> bounding the >>>>>>>>>>> generic >>>>>>>>>>>>>>>>> parameter properly. As for the order, since the list is >>>>>>>>>>>>>>>>> already in a >>>>>>>>>>>>>>>>> specific order, which the user themselves controls, it >>>>>>>>>>>>>>>>> doesn't seem >>>>>>>>>>>>>>>>> strictly necessary to offer an option to sort the data during >>>>>>>>>>> serialization. >>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>> Thanks, >>>>>>>>>>>>>>>>> -John >>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>> On Mon, May 6, 2019 at 8:47 PM Development <d...@yeralin.net >>>>>>>>>>> <mailto:d...@yeralin.net>> wrote: >>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>> Hi John, >>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>> I’m really sorry for the confusion. I cloned that JIRA >>>>>>>>>>>>>>>>>> ticket from >>>>>>>>>>> an old >>>>>>>>>>>>>>>>>> one about introducing UUID Serde, and I guess was too hasty >>>>>>>>>>>>>>>>>> while >>>>>>>>>>> editing >>>>>>>>>>>>>>>>>> the copy to notice the mistake. Just edited the ticket. >>>>>>>>>>>>>>>>>> Sorry for >>>>>>>>>>> any >>>>>>>>>>>>>>>>>> inconvenience . >>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>> As per comparator, I agree. Let’s make user be responsible >>>>>>>>>>>>>>>>>> for >>>>>>>>>>>>>>>>>> implementing comparable interface. I was just thinking to >>>>>>>>>>>>>>>>>> make the >>>>>>>>>>> serde a >>>>>>>>>>>>>>>>>> little more flexible (i.e. let user decide in which order >>>>>>>>>>>>>>>>>> records >>>>>>>>>>> is going >>>>>>>>>>>>>>>>>> to be inserted into a change log topic). >>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>> Thank you! >>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>> Best, >>>>>>>>>>>>>>>>>> Daniyar Yeralin >>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>> On May 6, 2019, at 5:37 PM, John Roesler <j...@confluent.io >>>>>>>>>>> <mailto:j...@confluent.io>> wrote: >>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>> Hi Daniyar, >>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>> Thanks for the proposal! >>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>> If I understand the point about the comparator, is it just >>>>>>>>>>>>>>>>>>> to >>>>>>>>>>> capture the >>>>>>>>>>>>>>>>>>> generic type parameter? If so, then anything that >>>>>>>>>>>>>>>>>>> implements a >>>>>>>>>>> known >>>>>>>>>>>>>>>>>>> interface would work just as well, right? I've been >>>>>>>>>>>>>>>>>>> considering >>>>>>>>>>> adding >>>>>>>>>>>>>>>>>>> something like the Jackson TypeReference (or similar >>>>>>>>>>>>>>>>>>> classes in >>>>>>>>>>> many >>>>>>>>>>>>>>>>>> other >>>>>>>>>>>>>>>>>>> projects). Would this be a good time to do it? >>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>> Note that it's not necessary to actually require that the >>>>>>>>>>> captured type >>>>>>>>>>>>>>>>>> is >>>>>>>>>>>>>>>>>>> Comparable (as this proposal currently does), it's just a >>>>>>>>>>>>>>>>>>> way to >>>>>>>>>>> make >>>>>>>>>>>>>>>>>> sure >>>>>>>>>>>>>>>>>>> there is some method that makes use of the generic type >>>>>>>>>>> parameter, to >>>>>>>>>>>>>>>>>> force >>>>>>>>>>>>>>>>>>> the compiler to capture the type. >>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>> Just to make sure I understand the motivation... You >>>>>>>>>>>>>>>>>>> expressed a >>>>>>>>>>> desire >>>>>>>>>>>>>>>>>> to >>>>>>>>>>>>>>>>>>> be able to serialize UUIDs, which I didn't follow, since >>>>>>>>>>>>>>>>>>> there is >>>>>>>>>>> a >>>>>>>>>>>>>>>>>>> built-in UUID serde: >>>>>>>>>>> org.apache.kafka.common.serialization.Serdes#UUID, >>>>>>>>>>>>>>>>>> and >>>>>>>>>>>>>>>>>>> also, a UUID isn't a List. Did you mean that you need to use >>>>>>>>>>> *lists of* >>>>>>>>>>>>>>>>>>> UUIDs? >>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>> Thanks, >>>>>>>>>>>>>>>>>>> -John >>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>> On Mon, May 6, 2019 at 11:49 AM Development >>>>>>>>>>>>>>>>>>> <d...@yeralin.net >>>>>>>>>>> <mailto:d...@yeralin.net>> wrote: >>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>> Hello, >>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>> Starting a discussion for KIP-466 adding support for List >>>>>>>>>>>>>>>>>>>> Serde. >>>>>>>>>>> PR is >>>>>>>>>>>>>>>>>>>> created under https://github.com/apache/kafka/pull/6592 < >>>>>>>>>>> https://github.com/apache/kafka/pull/6592> < >>>>>>>>>>>>>>>>>>>> https://github.com/apache/kafka/pull/6592 < >>>>>>>>>>> https://github.com/apache/kafka/pull/6592>> >>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>> There are two topics I would like to discuss: >>>>>>>>>>>>>>>>>>>> 1. Since type for List serve needs to be declared before >>>>>>>>>>>>>>>>>>>> hand, I >>>>>>>>>>> could >>>>>>>>>>>>>>>>>> not >>>>>>>>>>>>>>>>>>>> create a static method for List Serde under >>>>>>>>>>>>>>>>>>>> org.apache.kafka.common.serialization.Serdes. I addressed >>>>>>>>>>>>>>>>>>>> it in >>>>>>>>>>> the KIP: >>>>>>>>>>>>>>>>>>>> P.S. Static method corresponding to ListSerde under >>>>>>>>>>>>>>>>>>>> org.apache.kafka.common.serialization.Serdes (something >>>>>>>>>>>>>>>>>>>> like >>>>>>>>>>> static >>>>>>>>>>>>>>>>>> public >>>>>>>>>>>>>>>>>>>> Serde<List<T>> List() {...} >>>>>>>>>>>>>>>>>> inorg.apache.kafka.common.serialization.Serdes) >>>>>>>>>>>>>>>>>>>> class cannot be added because type needs to be defined >>>>>>>>>>> beforehand. >>>>>>>>>>>>>>>>>> That's >>>>>>>>>>>>>>>>>>>> why one needs to create List Serde in the following >>>>>>>>>>>>>>>>>>>> fashion: >>>>>>>>>>>>>>>>>>>> new Serdes.ListSerde<String>(Serdes.String(), >>>>>>>>>>>>>>>>>>>> Comparator.comparing(String::length)); >>>>>>>>>>>>>>>>>>>> (can possibly be simplified by declaring import static >>>>>>>>>>>>>>>>>>>> org.apache.kafka.common.serialization.Serdes.ListSerde) >>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>> 2. @miguno Michael G. Noll <https://github.com/miguno < >>>>>>>>>>> https://github.com/miguno>> is questioning >>>>>>>>>>>>>>>>>>>> whether I need to pass a comparator to ListDeserializer. >>>>>>>>>>>>>>>>>>>> This >>>>>>>>>>> certainly >>>>>>>>>>>>>>>>>> is >>>>>>>>>>>>>>>>>>>> not required. Feel free to add your input: >>>>>>>>>>>>>>>>>>>> https://github.com/apache/kafka/pull/6592#discussion_r281152067 >>>>>>>>>>> <https://github.com/apache/kafka/pull/6592#discussion_r281152067> >>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>> Thank you! >>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>> Best, >>>>>>>>>>>>>>>>>>>> Daniyar Yeralin >>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>> On May 6, 2019, at 11:59 AM, Daniyar Yeralin (JIRA) < >>>>>>>>>>> j...@apache.org <mailto:j...@apache.org>> >>>>>>>>>>>>>>>>>>>> wrote: >>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>> Daniyar Yeralin created KAFKA-8326: >>>>>>>>>>>>>>>>>>>>> -------------------------------------- >>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>> Summary: Add List<T> Serde >>>>>>>>>>>>>>>>>>>>> Key: KAFKA-8326 >>>>>>>>>>>>>>>>>>>>> URL: >>>>>>>>>>> https://issues.apache.org/jira/browse/KAFKA-8326 < >>>>>>>>>>> https://issues.apache.org/jira/browse/KAFKA-8326> >>>>>>>>>>>>>>>>>>>>> Project: Kafka >>>>>>>>>>>>>>>>>>>>> Issue Type: Improvement >>>>>>>>>>>>>>>>>>>>> Components: clients, streams >>>>>>>>>>>>>>>>>>>>> Reporter: Daniyar Yeralin >>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>> I propose adding serializers and deserializers for the >>>>>>>>>>> java.util.List >>>>>>>>>>>>>>>>>>>> class. >>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>> I have many use cases where I want to set the key of a >>>>>>>>>>>>>>>>>>>>> Kafka >>>>>>>>>>> message to >>>>>>>>>>>>>>>>>>>> be a UUID. Currently, I need to turn UUIDs into strings or >>>>>>>>>>>>>>>>>>>> byte >>>>>>>>>>> arrays >>>>>>>>>>>>>>>>>> and >>>>>>>>>>>>>>>>>>>> use their associated Serdes, but it would be more >>>>>>>>>>>>>>>>>>>> convenient to >>>>>>>>>>>>>>>>>> serialize >>>>>>>>>>>>>>>>>>>> and deserialize UUIDs directly. >>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>> I believe there are many use cases where one would want >>>>>>>>>>>>>>>>>>>>> to have >>>>>>>>>>> a List >>>>>>>>>>>>>>>>>>>> serde. Ex. [ >>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>> >>>>>>>>>>> https://stackoverflow.com/questions/41427174/aggregate-java-objects-in-a-list-with-kafka-streams-dsl-windows >>>>>>>>>>> < >>>>>>>>>>> https://stackoverflow.com/questions/41427174/aggregate-java-objects-in-a-list-with-kafka-streams-dsl-windows >>>>>>>>>>>> >>>>>>>>>>>>>>>>>> ], >>>>>>>>>>>>>>>>>>>> [ >>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>> >>>>>>>>>>> https://stackoverflow.com/questions/46365884/issue-with-arraylist-serde-in-kafka-streams-api >>>>>>>>>>> < >>>>>>>>>>> https://stackoverflow.com/questions/46365884/issue-with-arraylist-serde-in-kafka-streams-api >>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>> ] >>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>> KIP Link: [ >>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>> >>>>>>>>>>> https://cwiki.apache.org/confluence/display/KAFKA/KIP-466%3A+Add+support+for+List%3CT%3E+serialization+and+deserialization >>>>>>>>>>> < >>>>>>>>>>> https://cwiki.apache.org/confluence/display/KAFKA/KIP-466%3A+Add+support+for+List%3CT%3E+serialization+and+deserialization >>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>> ] >>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>> -- >>>>>>>>>>>>>>>>>>>>> This message was sent by Atlassian JIRA >>>>>>>>>>>>>>>>>>>>> (v7.6.3#76005) >>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>> >>>>>>>>>>>>>> >>>>>>>>>>>>> >>>>>>>>>>> >>>>>>>>>>> >>>>>>>>> >>>>>>>> >>>>>> >>>> >>> >> >