[
https://issues.jboss.org/browse/IPROTO-120?page=com.atlassian.jira.plugin...
]
Nistor Adrian commented on IPROTO-120:
--------------------------------------
See this issue on protostream:
https://issues.jboss.org/browse/IPROTO-64
It came after Galder reported this in infinispan:
https://issues.jboss.org/browse/ISPN-9072, which results from a discussion happening on
IRC or Zulip, don't remember where.
I'm not one of the people that thinks this is a must, but rather a nice to have, but I
accepted that some need this, and coincidentally protobuf-java also does it like this. If
you listen to their arguments, indeed, from a domain modelling perspective we should
prefer empty collections instead of nulls. I also passionately hate java.util.Optional and
would rather use nulls whenever possible. I do not like the default value handling for
missing fields in protobuf (which ATM I did not implement even though some people chase me
with a stick for that). Would you like to get an empty string instead of a null?
Seriously? So what do we do? At the time I accepted implementing IPROTO-64 I was
suggesting a possible flag to enable that behaviour per field. Or the flag could be also
per class or global, whatever. But I did not implement a public flag yet. But 4.3.x is
still alpha, so it's theoretically still doable. Have a look at
AbstractMarshallerCodeGenerator.noDefaults to see what I!
mean.
Null collection fields always unmarshalled as empty collection
implementation
-----------------------------------------------------------------------------
Key: IPROTO-120
URL:
https://issues.jboss.org/browse/IPROTO-120
Project: Infinispan ProtoStream
Issue Type: Bug
Reporter: Ryan Emerson
Assignee: Nistor Adrian
Priority: Major
The following Pojo always returns an empty collection after being unmarshalled,
regardless of whether {{stringList}} was null or empty when marshalled.
{code:java}
public class SomePojo {
@ProtoField(number = 1, collectionImplementation = ArrayList.class)
final List<String> stringList;
@ProtoFactory
public SomePojo(List<String> stringList) {
this.stringList = stringList;
}
}
{code}
This is because the generated marshaller always creates the collection instance before
attempting to read the collection content:
{code:java}
java.util.ArrayList __c$1 = new java.util.ArrayList();
boolean done = false;
while (!done) {
final int tag = $2.readTag();
switch (tag) {
case 0:
done = true;
break;
case 10: {
java.lang.String __v$1 = $2.readString();
__c$1.add(__v$1);
break;
}
default: {
if (!$2.skipField(tag)) done = true;
}
}
}
return new org.infinispan.query.dsl.embedded.testdomain.hsearch.SomePojo(__c$1);
{code}
--
This message was sent by Atlassian Jira
(v7.13.8#713008)