To clarify, what I am suggesting is to only remove the default implementation for these methods. So users would be required to implement serialize(topic, data) and deserialize(topic, data).
-Jason On Thu, Aug 23, 2018 at 1:48 PM, Jason Gustafson <ja...@confluent.io> wrote: > Hey Viktor, > > Thinking about it a little more, I wonder if we should just not provide a > default method for serialize(topic, data) and deserialize(topic, data). > Implementing these methods is a trivial burden for users and it feels like > there's no good solution which allows both methods to have default > implementations. > > Also, ack on KIP-331. Thanks for the pointer. > > -Jason > > On Thu, Aug 23, 2018 at 12:30 PM, Viktor Somogyi-Vass < > viktorsomo...@gmail.com> wrote: > >> Hi Ismael, >> >> Regarding the deprecation of the 2 parameter method: should we do this >> with >> the Serializer interface as well? >> >> I've updated the "Rejected Alternatives" with a few. >> I've added this circular reference one too but actually there's a way >> (pretty heavyweight) by adding a guard class that prevents recursive >> invocation of either methods. I've tried this out but it seems to me an >> overshoot. So just for the sake of completeness I'll copy it here. :) >> >> public interface Deserializer<T> extends Closeable { >> >> class Guard { >> >> private Set<Object> objects = Collections.synchronizedSet(new >> HashSet<>()); // might as well use concurrent hashmap >> >> private void methodCallInProgress(Object x) { >> objects.add(x); >> } >> >> private boolean isMethodCallInProgress(Object x) { >> return objects.contains(x); >> } >> >> private void clearMethodCallInProgress(Object x) { >> objects.remove(x); >> } >> >> private <T> T guard(Supplier<T> supplier) { >> if (GUARD.isMethodCallInProgress(this)) { >> throw new IllegalStateException("You must implement one of >> the deserialize methods"); >> } else { >> try { >> GUARD.methodCallInProgress(this); >> return supplier.get(); >> } finally { >> GUARD.clearMethodCallInProgress(this); >> } >> } >> } >> } >> >> Guard GUARD = new Guard(); >> >> void configure(Map<String, ?> configs, boolean isKey); >> >> default T deserialize(String topic, byte[] data) { >> return GUARD.guard(() -> deserialize(topic, null, data)); >> } >> >> default T deserialize(String topic, Headers headers, byte[] data) { >> return GUARD.guard(() -> deserialize(topic, data)); >> } >> >> @Override >> void close(); >> } >> >> >> Cheers, >> Viktor >> >> On Thu, Aug 23, 2018 at 3:50 PM Ismael Juma <ism...@juma.me.uk> wrote: >> >> > Also, we may consider deprecating the deserialize method that does not >> take >> > headers. Yes, it's a convenience, but it also adds confusion. >> > >> > Ismael >> > >> > On Thu, Aug 23, 2018 at 6:48 AM Ismael Juma <ism...@juma.me.uk> wrote: >> > >> > > I think the KIP needs the rejected alternatives section to have more >> > > detail. For example, another option would be something like the >> > following, >> > > which works great as long as one overrides one of the methods, but >> pretty >> > > bad if one doesn't. :) >> > > >> > > default T deserialize(String topic, byte[] data) { >> > > return deserialize(topic, null, data); >> > > } >> > > >> > > default T deserialize(String topic, Headers headers, byte[] data) { // >> > > This is the new method >> > > return deserialize(topic, data); >> > > } >> > > >> > > >> > > On Thu, Aug 23, 2018 at 3:57 AM Viktor Somogyi-Vass < >> > > viktorsomo...@gmail.com> wrote: >> > > >> > >> Hi Jason, >> > >> >> > >> Thanks for the feedback. >> > >> 1. I chose to return null here because according to the >> documentation it >> > >> may return null data, therefore the users of this methods are >> perpared >> > for >> > >> getting a null. Thinking of it though it may be better to throw an >> > >> exception by default because it'd indicate a programming error. >> However, >> > >> would that be a backward incompatible change? I'm simply thinking of >> > this >> > >> because this is a new behavior that we'd introduce but I'm not sure >> yet >> > if >> > >> it'd cause problems. >> > >> Do you think it'd make sense to do the same in `serialize`? >> > >> 2. Yes, I believe that is covered in KIP-331: >> > >> >> > >> >> > https://cwiki.apache.org/confluence/display/KAFKA/KIP-331+ >> Add+default+implementation+to+close%28%29+and+configure%28% >> 29+for+Serializer%2C+Deserializer+and+Serde >> > >> >> > >> Cheers, >> > >> Viktor >> > >> >> > >> On Wed, Aug 22, 2018 at 6:11 PM Jason Gustafson <ja...@confluent.io> >> > >> wrote: >> > >> >> > >> > Hey Viktor, >> > >> > >> > >> > This is a nice cleanup. Just a couple quick questions: >> > >> > >> > >> > 1. Rather than returning null for the default `deserialize(topic, >> > >> data)`, >> > >> > would it be better to throw UnsupportedOperationException? I assume >> > that >> > >> > internally we'll always invoke the api which takes headers. >> Similarly >> > >> for >> > >> > `serialize(topic, data)`. >> > >> > 2. Would it make sense to have default no-op implementations for >> > >> > `configure` and `close`? >> > >> > >> > >> > Thanks, >> > >> > Jason >> > >> > >> > >> > On Wed, Aug 22, 2018 at 5:27 AM, Satish Duggana < >> > >> satish.dugg...@gmail.com> >> > >> > wrote: >> > >> > >> > >> > > +1 >> > >> > > >> > >> > > On Wed, Aug 22, 2018 at 4:45 PM, Ted Yu <yuzhih...@gmail.com> >> > wrote: >> > >> > > >> > >> > > > +1 >> > >> > > > -------- Original message --------From: Kamal Chandraprakash < >> > >> > > > kamal.chandraprak...@gmail.com> Date: 8/22/18 3:19 AM >> > (GMT-08:00) >> > >> > To: >> > >> > > > dev@kafka.apache.org Subject: Re: [VOTE] KIP-336: Consolidate >> > >> > > > ExtendedSerializer/Serializer and >> > ExtendedDeserializer/Deserializer >> > >> > > > +1 >> > >> > > > >> > >> > > > Thanks for the KIP! >> > >> > > > >> > >> > > > On Wed, Aug 22, 2018 at 2:48 PM Viktor Somogyi-Vass < >> > >> > > > viktorsomo...@gmail.com> >> > >> > > > wrote: >> > >> > > > >> > >> > > > > Hi All, >> > >> > > > > >> > >> > > > > I'd like to start a vote on this KIP ( >> > >> > > > > https://cwiki.apache.org/confluence/pages/viewpage. >> > >> > > > action?pageId=87298242) >> > >> > > > > which aims to refactor ExtendedSerializer/Serializer and >> > >> > > > > ExtendedDeserializer/Deserializer. >> > >> > > > > >> > >> > > > > To summarize what's the motivation: >> > >> > > > > >> > >> > > > > When headers were introduced by KIP-82 the ExtendedSerializer >> > and >> > >> > > > > ExtendedDeserializer classes were created in order to keep >> > >> interface >> > >> > > > > compatibility but still add `T deserialize(String topic, >> Headers >> > >> > > headers, >> > >> > > > > byte[] data);` and `byte[] serialize(String topic, Headers >> > >> headers, T >> > >> > > > > data);` methods that consume the headers for >> > >> > > > serialization/deserialization. >> > >> > > > > The reason for doing so was that Kafka at that time needed be >> > >> > > compatbile >> > >> > > > > with Java 7. Since we're not compiling on Java 7 anymore >> > >> (KAFKA-4423) >> > >> > > > we'll >> > >> > > > > try consolidate the way we're using these in a backward >> > compatible >> > >> > > > fashion: >> > >> > > > > deprecating the Extended* classes and moving the >> aforementioned >> > >> > methods >> > >> > > > up >> > >> > > > > in the class hierarchy. >> > >> > > > > >> > >> > > > > I'd be happy to get votes or additional feedback on this. >> > >> > > > > >> > >> > > > > Viktor >> > >> > > > > >> > >> > > > >> > >> > > >> > >> > >> > >> >> > > >> > >> > >