Hmm the formatting got removed unfortunately. I’m sorry, it got harder to read my email.
> On Jun 12, 2019, at 10:27 AM, Development <d...@yeralin.net> wrote: > > 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) >>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>> >>>>>>>>>>>>>> >>>>>>>>>>>> >>>>>>>>>>>> >>>>>>>>>> >>>>>>>>> >>>>>>> >>>>> >>>> >>> >> >