3.泛化调用
2020-09-04 本文已影响0人
山海树
通常是服务调用方没有引入API包,也就不包含接口中的实体类,故服务调用方只能提供Map形式的数据,由服务提供者根据Map转化成对应的实体。
1.generic=true
只需要将参数列表Object[]反序列化为pojo即可,具体的反序列化为PojoUtils#realize
ReferenceConfig<GenericService> referenceConfig = new ReferenceConfig<>();
referenceConfig.setApplication(new ApplicationConfig("true-generic-consumer"));
referenceConfig.setRegistry(new RegistryConfig("zookeeper://127.0.0.1:2181"));
referenceConfig.setVersion("1.0.0");
referenceConfig.setGroup("dubbo");
referenceConfig.setInterface("service.GreetingService");
referenceConfig.setTimeout(5000);
//泛化引用,类型为true
referenceConfig.setGeneric(true);
GenericService genericService = referenceConfig.get();
//泛型调用,基本类型以及Date、List、Map等不需要转换,直接调用,如果返回值是POJO,也净自动转为Map
Object result = genericService.$invoke("sayHello", new String[] {"java.lang.String"}, new Object[] {"world"});
System.out.println(JSON.json(result));
//POJO参数转换为MAP
Map<String, Object> map = new HashMap<>();
map.put("class","entity.Pojo");
map.put("id","1990");
map.put("name","linjunjie");
result = genericService.$invoke("testGeneric",new String[]{"entity.Pojo"},new Object[]{map});
System.out.println(result);
2.generic=bean
使用javabean序列化参数,在服务端这边通过javabean反序列化参数成pojo对象
ReferenceConfig<GenericService> referenceConfig = new ReferenceConfig<>();
referenceConfig.setApplication(new ApplicationConfig("true-generic-consumer"));
referenceConfig.setRegistry(new RegistryConfig("zookeeper://127.0.0.1:2181"));
referenceConfig.setVersion("1.0.0");
referenceConfig.setGroup("dubbo");
referenceConfig.setInterface("service.GreetingService");
referenceConfig.setTimeout(5000);
//泛化引用,类型为true
referenceConfig.setGeneric("bean");
GenericService genericService = referenceConfig.get();
//泛型调用,参数使用JavaBean进行序列化
JavaBeanDescriptor param = JavaBeanSerializeUtil.serialize("world");
Object result = genericService.$invoke("sayHello", new String[] {"java.lang.String"}, new Object[] {param});
result = JavaBeanSerializeUtil.deserialize((JavaBeanDescriptor) result);
System.out.println(result);
/*
//POJO参数转换为MAP
Map<String, Object> map = new HashMap<>();
map.put("class","entity.Pojo");
map.put("id","1990");
map.put("name","linjunjie");
param = JavaBeanSerializeUtil.serialize(map);
result = genericService.$invoke("testGeneric",new String[]{"entity.Pojo"},new Object[]{param});
result = JavaBeanSerializeUtil.deserialize((JavaBeanDescriptor) result);
System.out.println(result);*/
3.generic=nativejava
使用nativejava序列化参数,在服务端这边通过nativejava反序列化参数成pojo对象
ReferenceConfig<GenericService> referenceConfig = new ReferenceConfig<>();
referenceConfig.setApplication(new ApplicationConfig("true-generic-consumer"));
referenceConfig.setRegistry(new RegistryConfig("zookeeper://127.0.0.1:2181"));
referenceConfig.setVersion("1.0.0");
referenceConfig.setGroup("dubbo");
referenceConfig.setInterface("service.GreetingService");
referenceConfig.setTimeout(5000);
//泛化引用,类型为true
referenceConfig.setGeneric("nativejava");
GenericService genericService = referenceConfig.get();
//泛型调用,参数使用JavaBean进行序列化
UnsafeByteArrayOutputStream out = new UnsafeByteArrayOutputStream();
ExtensionLoader.getExtensionLoader(Serialization.class)
.getExtension(Constants.GENERIC_SERIALIZATION_NATIVE_JAVA)
.serialize(null, out)
.writeObject("world");
Object result = genericService.$invoke("sayHello", new String[] {"java.lang.String"}, new Object[] {out.toByteArray()});
UnsafeByteArrayInputStream in = new UnsafeByteArrayInputStream((byte[])result);
System.out.println(ExtensionLoader.getExtensionLoader(Serialization.class)
.getExtension(Constants.GENERIC_SERIALIZATION_NATIVE_JAVA)
.deserialize(null, in)
.readObject());
/*
//POJO参数转换为MAP
UnsafeByteArrayOutputStream out = new UnsafeByteArrayOutputStream();
Pojo pojo = new Pojo();
pojo.setId("abcdefg");
pojo.setName("七月的风");
ExtensionLoader.getExtensionLoader(Serialization.class)
.getExtension(Constants.GENERIC_SERIALIZATION_NATIVE_JAVA)
.serialize(null, out)
.writeObject(pojo);
Object result = genericService.$invoke("testGeneric",new String[]{"entity.Pojo"},new Object[]{out.toByteArray()});
UnsafeByteArrayInputStream in = new UnsafeByteArrayInputStream((byte[])result);
System.out.println(ExtensionLoader.getExtensionLoader(Serialization.class)
.getExtension(Constants.GENERIC_SERIALIZATION_NATIVE_JAVA)
.deserialize(null, in)
.readObject());*/
综述:由demo可以看出,如果没有引入第三方包的情况下,但是参数类型不是基本类型,则只能用generic=true这中方式来实现,如果参数不是基本类型,则三种都可以。