You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@ignite.apache.org by Pavel Pereslegin <xx...@gmail.com> on 2018/05/31 08:38:32 UTC

OptimizedObjectInputStream#available() doesn't work as expected?

Hello Igniters!

When deserializing Externalizable cache entry it's impossible to use
ObjectInput#available method for checking is there anything left to
read in buffer. This is because OptimizedObjectInputStream#available
always returns -1 (hard-coded).

Does anyone know the reasons why this method is not fully implemented?
Is it acceptable to extend GridDataInput with method available() and
implement it by calling available() from underlying input stream?

I've faced with such problem when I tried to put additional field into
GridCacheSetHeader class. It should be able to read both the old and
new versions of this class, so, currently, I have to catch
EOFException to safely read the old one.

@Override public void readExternal(ObjectInput in) throws IOException {
    oldField = in.readInt();
    ...
    try {
        newField = in.readInt();
    }
    catch (EOFException e) {
        newField = DEFAULT_VALUE;
    }
}

With available() method this code will look like

@Override public void readExternal(ObjectInput in) throws IOException {
    oldField = in.readInt();
    ...
    if (in.available() > 0)
        newField = in.readInt();
    else
        newField = DEFAULT_VALUE;
}

Which case is preferred – to catch EOFException or to implement
available() at GridDataInput which looks obsolete?

Re: OptimizedObjectInputStream#available() doesn't work as expected?

Posted by Anton Vinogradov <av...@apache.org>.
Folks,

I checked and it's possible to use available() directly from stream
encapsulated at GridDataInput, but I'm not sure it's a good idea to update
almost obsolete classes.

Catching EOFException hack looks as reasonable solution in current case.

Thoughts?


чт, 31 мая 2018 г. в 11:39, Pavel Pereslegin <xx...@gmail.com>:

> Hello Igniters!
>
> When deserializing Externalizable cache entry it's impossible to use
> ObjectInput#available method for checking is there anything left to
> read in buffer. This is because OptimizedObjectInputStream#available
> always returns -1 (hard-coded).
>
> Does anyone know the reasons why this method is not fully implemented?
> Is it acceptable to extend GridDataInput with method available() and
> implement it by calling available() from underlying input stream?
>
> I've faced with such problem when I tried to put additional field into
> GridCacheSetHeader class. It should be able to read both the old and
> new versions of this class, so, currently, I have to catch
> EOFException to safely read the old one.
>
> @Override public void readExternal(ObjectInput in) throws IOException {
>     oldField = in.readInt();
>     ...
>     try {
>         newField = in.readInt();
>     }
>     catch (EOFException e) {
>         newField = DEFAULT_VALUE;
>     }
> }
>
> With available() method this code will look like
>
> @Override public void readExternal(ObjectInput in) throws IOException {
>     oldField = in.readInt();
>     ...
>     if (in.available() > 0)
>         newField = in.readInt();
>     else
>         newField = DEFAULT_VALUE;
> }
>
> Which case is preferred – to catch EOFException or to implement
> available() at GridDataInput which looks obsolete?
>