[infinispan-issues] [JBoss JIRA] (IPROTO-120) Null collection fields always unmarshalled as empty collection implementation

Nistor Adrian (Jira) issues at jboss.org
Wed Oct 2 14:07:00 EDT 2019


    [ https://issues.jboss.org/browse/IPROTO-120?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=13792463#comment-13792463 ] 

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)


More information about the infinispan-issues mailing list