[infinispan-issues] [JBoss JIRA] (IPROTO-56) DynamicEntity support in MarshallerProvider

Gustavo Fernandes (JIRA) issues at jboss.org
Fri Jun 15 10:06:01 EDT 2018


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

Gustavo Fernandes edited comment on IPROTO-56 at 6/15/18 10:05 AM:
-------------------------------------------------------------------

One solution (or hack), similar to OGM, is to have a ThreadLocal object that would store the type. The MarshallerProvider would then use this storage to return the correct marshaller:

{code:java}
class MarshallerProvider implements SerializationContext.MarshallerProvider {
...
public MarshallerProvider(ThreadLocalStorage typeContainer) {
     this.threadLocalStorage = ...
}

@Override
public BaseMarshaller<?> getMarshaller(Class<?> javaClass) {
      return new EntityMarshaller(threadLocalStorage.getType());
}
{code}

This solution needs careful testing and as it's not guaranteed that the SerCtx is used to marshall and unmarshall from the same thread (this happens in the Hot Rod client).

EDIT: will also require some decoration around protostream marshallers and classes, as it needs to write to the threadlocal storage depending on the instance being serialized


was (Author: gustavonalle):
One solution (or hack), similar to OGM, is to have a ThreadLocal object that would store the type. The MarshallerProvider would then use this storage to return the correct marshaller:

{code:java}
class MarshallerProvider implements SerializationContext.MarshallerProvider {
...
public MarshallerProvider(ThreadLocalStorage typeContainer) {
     this.threadLocalStorage = ...
}

@Override
public BaseMarshaller<?> getMarshaller(Class<?> javaClass) {
      return new EntityMarshaller(threadLocalStorage.getType());
}
{code}

This solution needs careful testing and as it's not guaranteed that the SerCtx is used to marshall and unmarshall from the same thread (this happens in the Hot Rod client).

EDIT: will require some decoration around protostream marshallers and classes, as it needs to write to the threadlocal storage depending on the instance being serialized

> DynamicEntity support in MarshallerProvider
> -------------------------------------------
>
>                 Key: IPROTO-56
>                 URL: https://issues.jboss.org/browse/IPROTO-56
>             Project: Infinispan ProtoStream
>          Issue Type: Bug
>            Reporter: Gustavo Fernandes
>
> The use case is a class that describe the entity. This class contains a 'type' and a list of properties. MarshallerProvider is used to associate a type with a marshaller that uses this 'type' to understand the fields and data types to read/write the stream.
> The type of the entity is contained in the entity itself, and when reading from the stream, this type is used to figure out the fields to read. During writes, though, the type is not involved so it's not possible to use the same strategy. 
> Attached is a unit test to illustrate the situation. This is not necessarily a bug, it may be possible to achieve the usage of Dynamic Entities under other circumstances, or maybe the API needs to be extended.



--
This message was sent by Atlassian JIRA
(v7.5.0#75005)


More information about the infinispan-issues mailing list