h1. 現象
為一個dubbbo介面新增了一個方法:
{code}DomainObject<String> testSer();實現:@Override public DomainObject<String> testSer() { DomainObject<String> result = new DomainObject<String>(); result.setAge(10); result.setName("test"); result.add("DomainObject1"); return result; }{code}
傳回值定義如下:
{code}public class DomainObject<E> extends ArrayList<E> { private static final long serialVersionUID = -7393642276493435828L; private String name; private int age;}{code}
遠程調用:
{code}DomainObject<String> result = voucherInfoQueryService.testSer();System.out.println(result.getAge());System.out.println(result.getName());System.out.println(result.get(0));{code}
輸出結果:丟失了age和name兩個屬性的值,而 list內部的值還是存在的
{code}0nullDomainObject1{code}h1. 問題排查h4. 使用java內建序列化執行序列化和還原序列化, 不會出現屬性丟失的問題,懷疑dubbo序列化有特殊處理h4. dubbo 預設用的序列化協議是hessian2,查看代碼
序列化時代碼如下:
{code}public void writeObject(Object object) throws IOException { if (object == null) { writeNull(); return; } Serializer serializer; ##尋找對應的serializer serializer = findSerializerFactory().getSerializer(object.getClass()); ##序列化 serializer.writeObject(object, this); }{code}
尋找serializer:由代碼可知,上面的DomainObject對應的serializer是CollectionSerializer
{code}public Serializer getSerializer(Class cl) throws HessianProtocolException { ... else if (Collection.class.isAssignableFrom(cl)) { if (_collectionSerializer == null) {_collectionSerializer = new CollectionSerializer(); ... }{code}
CollectionSerializer.writeObject
{code}public void writeObject(Object obj, AbstractHessianOutput out) throws IOException { ... Iterator iter = list.iterator(); while (iter.hasNext()) { Object value = iter.next(); out.writeObject(value); } ... }{code}
所以,屬性丟失。