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 <[email protected]> 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 <[email protected]> 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 <[email protected]>
>>>> 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 <[email protected]> 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 <[email protected]> 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 <[email protected]> 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 <[email protected]> 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
>>>>>>>>>> <[email protected]> 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 <[email protected]> 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 <[email protected]> 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 <[email protected]>
>>>>>>>>>>>> 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 <[email protected]>
>>>>>>>>>>>>>> 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 <[email protected]
>>>>>>>>>>>>>> <mailto:
>>>>>>>>>>> [email protected]>> 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 <[email protected]
>>>>>>>>>>>>>>> <mailto:
>>>>>>>>>>> [email protected]>> 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 <[email protected]
>>>>>>>>>>>>>>> <mailto:
>>>>>>>>>>> [email protected]>> 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 <[email protected]
>>>>>>>>>>> <mailto:[email protected]>> 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 <[email protected]
>>>>>>>>>>> <mailto:[email protected]>> 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 <[email protected]
>>>>>>>>>>> <mailto:[email protected]>> 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
>>>>>>>>>>>>>>>>>>> <[email protected]
>>>>>>>>>>> <mailto:[email protected]>> 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) <
>>>>>>>>>>> [email protected] <mailto:[email protected]>>
>>>>>>>>>>>>>>>>>>>> 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)
>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>
>>>>>>>>>>>>>
>>>>>>>>>>>
>>>>>>>>>>>
>>>>>>>>>
>>>>>>>>
>>>>>>
>>>>
>>>
>>
>