Hi,andot. I encountered some serializer problem while using HPROSE for rpc, it will try to make the Object[] arguments serialized. but hprose seems to support the basic types of arguments but not for complexd (or with self-defined) arguments. I don't know how to register the specific serializer. here comes the arguments.
1.ITransferMsg
public interface ITransferMsg<T> extends java.io.Serializable {
String getIdentifier();
MetaData getMetaData();
T getPayload();
Class<?> getPayloadType();
ITransferMsg<T> withMetaData(Map<String, Object> metaData);
ITransferMsg<T> andMetaData(Map<String, Object> metaData);
Map<String,Object> getMetaValue();
}
2.ITransferMsg implementation
public class GenericTransferMsg<T> implements ITransferMsg<T> {
private static final long serialVersionUID = -2860606356253432506L;
private final String identifier;
private final MetaData metaData;
private final Class<?> payloadType;
private final T payload;
// for kryo default constructor is needed
public GenericTransferMsg() {
identifier = null;
metaData = MetaData.emptyInstance();
payload = null;
payloadType = Void.TYPE;
}
/**
* Constructs a Message for the given
* <code>payload</code> using empty metadata.
*
* @param payload The payload for the message
*/
public GenericTransferMsg(T payload) {
this(payload, MetaData.emptyValues());
}
/**
* Constructs a Message for the given
* <code>payload</code> and <code>meta data</code>.
*
* @param payload The payload for the message
* @param metaData The meta data for the message
*/
public GenericTransferMsg(T payload, Map<String, Object> metaData) {
this(UUIDHelper.random().toString(), payload, metaData);
}
/**
* @param payload
* @param metData
*/
public GenericTransferMsg(T payload, MetaData metData) {
this(UUIDHelper.random().toString(), payload, metData);
}
/**
* Constructor to reconstruct a Message using existing data.
*
* @param identifier The identifier of the Message
* @param payload The payload of the message
* @param metaData The meta data of the message
*/
public GenericTransferMsg(String identifier, T payload, Map<String, Object> metaData) {
this(identifier, payload, MetaData.from(metaData));
}
/**
* Constructor to reconstruct a Message using existing data.
*
* @param identifier The identifier of the Message
* @param payload The payload of the message
* @param metaData The meta data of the message
*/
public GenericTransferMsg(String identifier, T payload, MetaData metaData) {
this.identifier = identifier;
this.metaData = metaData;
this.payload = payload;
this.payloadType = payload.getClass();
}
protected GenericTransferMsg(GenericTransferMsg<T> original, Map<String, Object> metaData) {
this(original, MetaData.from(metaData));
}
protected GenericTransferMsg(GenericTransferMsg<T> original, MetaData metaData) {
this.identifier = original.getIdentifier();
this.payload = original.getPayload();
this.payloadType = payload.getClass();
this.metaData = metaData;
}
@Override
public String getIdentifier() {
return identifier;
}
@Override
public MetaData getMetaData() {
return metaData;
}
@Override
public T getPayload() {
return payload;
}
@Override
public Class<?> getPayloadType() {
return payloadType;
}
@Override
public GenericTransferMsg<T> withMetaData(Map<String, Object> newMetaData) {
return this.metaData.getValues().equals(newMetaData) ? this : new GenericTransferMsg<T>(this, newMetaData);
}
@Override
public GenericTransferMsg<T> andMetaData(Map<String, Object> additionalMetaData) {
return additionalMetaData.isEmpty() ? this : new GenericTransferMsg<T>(this, this.metaData.mergedWith(additionalMetaData));
}
@Override
public Map<String, Object> getMetaValue() {
return this.metaData.getValues();
}
}
3.GenericTransferMsg inheritance:
public class ChannelTransferMsg extends GenericTransferMsg<byte[]> {
private static final long serialVersionUID = -2860594938222827822L;
private ChannelTransferMsg() {
super();
}
private ChannelTransferMsg(byte[] payload) {
super(payload);
}
private ChannelTransferMsg(byte[] payload, Map<String, Object> metaData) {
super(payload, metaData);
}
private ChannelTransferMsg(byte[] payload, MetaData metaData) {
super(payload, metaData);
}
private ChannelTransferMsg(String identifier, byte[] payload, Map<String, Object> metaData) {
super(identifier, payload, metaData);
}
private ChannelTransferMsg(String identifier, byte[] payload, MetaData metaData) {
super(identifier, payload, metaData);
}
private ChannelTransferMsg(ChannelTransferMsg original, MetaData metaData) {
super(original, metaData);
}
public ChannelTransferMsg mergeDataData(Map<String, Object> additionalMetaData) {
return additionalMetaData.isEmpty() ? this : new ChannelTransferMsg(this, getMetaData().mergedWith(additionalMetaData));
}
public static ChannelTransferMsg createTransferMsg() {
return new ChannelTransferMsg();
}
public static ChannelTransferMsg createTransferMsg(byte[] payload) {
return new ChannelTransferMsg(payload);
}
public static ChannelTransferMsg createTransferMsg(byte[] payload, Map<String, Object> metaData) {
return new ChannelTransferMsg(payload, metaData);
}
public static ChannelTransferMsg createTransferMsg(byte[] payload, MetaData metaData) {
return new ChannelTransferMsg(payload, metaData);
}
public static ChannelTransferMsg createTransferMsg(String identifier, byte[] payload, Map<String, Object> metaData) {
return new ChannelTransferMsg(identifier, payload, metaData);
}
public static ChannelTransferMsg createTransferMsg(String identifier, byte[] payload, MetaData metaData) {
return new ChannelTransferMsg(identifier, payload, metaData);
}
@Override
public String toString() {
StringBuilder sb = new StringBuilder(100);
sb.append("Identifier{").append(getIdentifier())
.append("},PayLoad{").append(new String(getPayload()))
.append("},MetaData{").append(getMetaData().toString())
.append("}");
return sb.toString();
}
}
4.MetaData around the msg:
public class ChannelTransferMsg extends GenericTransferMsg<byte[]> {
private static final long serialVersionUID = -2860594938222827822L;
private ChannelTransferMsg() {
super();
}
private ChannelTransferMsg(byte[] payload) {
super(payload);
}
private ChannelTransferMsg(byte[] payload, Map<String, Object> metaData) {
super(payload, metaData);
}
private ChannelTransferMsg(byte[] payload, MetaData metaData) {
super(payload, metaData);
}
private ChannelTransferMsg(String identifier, byte[] payload, Map<String, Object> metaData) {
super(identifier, payload, metaData);
}
private ChannelTransferMsg(String identifier, byte[] payload, MetaData metaData) {
super(identifier, payload, metaData);
}
private ChannelTransferMsg(ChannelTransferMsg original, MetaData metaData) {
super(original, metaData);
}
public ChannelTransferMsg mergeDataData(Map<String, Object> additionalMetaData) {
return additionalMetaData.isEmpty() ? this : new ChannelTransferMsg(this, getMetaData().mergedWith(additionalMetaData));
}
public static ChannelTransferMsg createTransferMsg() {
return new ChannelTransferMsg();
}
public static ChannelTransferMsg createTransferMsg(byte[] payload) {
return new ChannelTransferMsg(payload);
}
public static ChannelTransferMsg createTransferMsg(byte[] payload, Map<String, Object> metaData) {
return new ChannelTransferMsg(payload, metaData);
}
public static ChannelTransferMsg createTransferMsg(byte[] payload, MetaData metaData) {
return new ChannelTransferMsg(payload, metaData);
}
public static ChannelTransferMsg createTransferMsg(String identifier, byte[] payload, Map<String, Object> metaData) {
return new ChannelTransferMsg(identifier, payload, metaData);
}
public static ChannelTransferMsg createTransferMsg(String identifier, byte[] payload, MetaData metaData) {
return new ChannelTransferMsg(identifier, payload, metaData);
}
@Override
public String toString() {
StringBuilder sb = new StringBuilder(100);
sb.append("Identifier{").append(getIdentifier())
.append("},PayLoad{").append(new String(getPayload()))
.append("},MetaData{").append(getMetaData().toString())
.append("}");
return sb.toString();
}
}
I want to make use of the transferMsg(like the channeTransferMsg), but it is not the standard one like simple object like user