ignite-dev mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From Andrey Kornev <andrewkor...@hotmail.com>
Subject RE: Binary object inside Externalizable
Date Sat, 20 Feb 2016 17:26:30 GMT

I think Ignite Serialization should follow the approach similar to what Java serialization
does: it can transparently and consistently handle both Serializable and Externalizable classes.
It can do it because it relies on a single class - ObjectOutputStream - to do serialization
(and a single class - ObjectInputStream - to do the opposite, but let's ignore it for the
moment). ObjectOutputStream delegates to proper user callbacks (writeObject or writeExternal)
at the right moments, but otherwise it fully controls the on-the-wire representation and takes
care of all the necessary stream framing/marking so that ObjectInputStream can then correctly
deserialize the bytes. It's never a problem for Java to serialize an Externalizable field
from a Serializable object and vice versa. Users can mix and match serialization APIs as they

I think Ignite should just have a single marshaller, let's say the Binary, which drives the
whole serialization process. It doesn't delegate to OptimizedMarshaller as it does today.
Instead it detects the Serializable/Externalizable classes and calls their serialization callbacks
- writeObject/writeExternal - passing in *itself* as ObjectOutputStream/ObjectOutput correspondingly.
This way the entire serialization process never leaves the context of a single Binary marshaller
and allows Ignite to handle such complex cases as the one we're discussing now.

I hope it makes sense.


> From: valentin.kulichenko@gmail.com
> Date: Fri, 19 Feb 2016 19:15:07 -0800
> Subject: Binary object inside Externalizable
> To: dev@ignite.apache.org
> Folks,
> I recently faced an issue which seems to be pretty critical. As you know,
> when binary marshaller meets an Externalizable object, it switches to
> optimized marshaller. And if there is a regular object inside, it's still
> serialized with optimized, even if its type is declared in binary
> configuration with custom mapper, etc. This looks wrong.
> It's getting even worse in compute grid, because closure processor wraps
> user's closures in some internal classes, which are Externalizable, so
> these closures are always serialized with optimized marshaller.
> Does anyone have ideas on what is the proper fix for this?
> -Val
  • Unnamed multipart/alternative (inline, None, 0 bytes)
View raw message