关于protostuff 序列化 list 不一致问题

窦立阳 2015-07-27 09:13:19
对对象A序列化,A中含有B对象,B对象中包含一个List,初始化后含有一项rpc-list,
序列化后生成byte[],我定义为test
当对test进行反序列话后,却出现了两个rpc-list。
控制台输出的:
print A-B-List before serialize
list[0]=rpc-list
print A-B-List after serialize
list[0]=rpc-list
list[1]=rpc-list
/******************************/
class A

public class A {
Object C;

public Object getC() {
return C;
}

public void setC(Object c) {
C = c;
}

public static void main(String[] args) {
B b = new B();
A a=new A();
a.setC(b);

B bb=(B)a.getC();
System.out.println("print A-B-List before serialize");
for (int i = 0; i < bb.getList().size(); i++) {
System.out.println("list["+i+"]="+bb.getList().get(i));
}
byte[] test=SerializationUtil.serialize(a);
A newA=SerializationUtil.deserialize(test, A.class);
bb=(B)newA.getC();
System.out.println("print A-B-List after serialize");
for (int i = 0; i < bb.getList().size(); i++) {
System.out.println("list["+i+"]="+bb.getList().get(i));
}

System.out.println();
}
}


/******************************/

public class B {
private int num;
private String str;
private List<String> list;
public B() {
num = 3;
str = "rpc";

list = new ArrayList<String>();
list.add("rpc-list");
}
public int getNum() {
return num;
}
public void setNum(int num) {
this.num = num;
}
public String getStr() {
return str;
}
public void setStr(String str) {
this.str = str;
}
public List<String> getList() {
return list;
}
public void setList(List<String> list) {
this.list = list;
}


}

/******************************/
序列化的类

public class SerializationUtil {

private static Map<Class<?>, Schema<?>> cachedSchema = new ConcurrentHashMap<Class<?>, Schema<?>>();

private static Objenesis objenesis = new ObjenesisStd(true);

private SerializationUtil() {
}

@SuppressWarnings("unchecked")
private static <T> Schema<T> getSchema(Class<T> cls) {
Schema<T> schema = (Schema<T>) cachedSchema.get(cls);
if (schema == null) {
schema = RuntimeSchema.createFrom(cls);
if (schema != null) {
cachedSchema.put(cls, schema);
}
}
return schema;
}


/**
* 序列化(对象 -> 字节数组)
*/
@SuppressWarnings("unchecked")
public static <T> byte[] serialize(T obj) {
Class<T> cls = (Class<T>) obj.getClass();
LinkedBuffer buffer = LinkedBuffer.allocate(LinkedBuffer.DEFAULT_BUFFER_SIZE);
try {
Schema<T> schema = getSchema(cls);
return ProtostuffIOUtil.toByteArray(obj, schema, buffer);
} catch (Exception e) {
throw new IllegalStateException(e.getMessage(), e);
} finally {
buffer.clear();
}
}

/**
* 反序列化(字节数组 -> 对象)
*/
public static <T> T deserialize(byte[] data, Class<T> cls) {
try {
T message = (T) objenesis.newInstance(cls);
Schema<T> schema = getSchema(cls);
ProtostuffIOUtil.mergeFrom(data, message, schema);
return message;
} catch (Exception e) {
throw new IllegalStateException(e.getMessage(), e);
}
}
}

/******************************/
...全文
793 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
pioneer92 2017-02-07
  • 打赏
  • 举报
回复 1
原因是protostuff反序列化的时候会调用无参构造方法,因为你在无参构造里面调用list.add(),所以会出现两个rpc-list
窦立阳 2015-12-11
  • 打赏
  • 举报
回复
谢谢大神,终于知道原因了。
不待人亲 2015-08-25
  • 打赏
  • 举报
回复
不好意思我错了, 没仔细看代码 protostuff的RuntimeEnv类其实提供了选项 ,设置System.getProperties().setProperty("protostuff.runtime.always_use_sun_reflection_factory", "true");就可以了, 不必修改protostuff代码
不待人亲 2015-08-25
  • 打赏
  • 举报
回复
忘了说, 直接在你的工程下新建一个io.protostuff.runtime.RuntimeEnv类即可, classloader会先加载你工程下的类,protostuff中的对应类不会被加载
不待人亲 2015-08-25
  • 打赏
  • 举报
回复
反序列化的时候调用了class B的构造方法, 所以出现了两个rpc-list, 修改io.protostuff.runtime.RuntimeEnv即可, 替换Instantiator的默认实现


看你代码中用了Objenesis, 就用Objenesis实现一个不需要调用构造方法的Instantiator就可以了
InstantiatorWithoutConstructorCalled
窦立阳 2015-08-14
  • 打赏
  • 举报
回复
没有,选择了替代的方式,
sam-fat-chang 2015-07-30
  • 打赏
  • 举报
回复
你解决了吗?同问
窦立阳 2015-07-27
  • 打赏
  • 举报
回复
用的jar 是

<!-- Protostuff -->
        <dependency>
            <groupId>com.dyuproject.protostuff</groupId>
            <artifactId>protostuff-core</artifactId>
            <version>1.0.7</version>
        </dependency>
        <dependency>
            <groupId>com.dyuproject.protostuff</groupId>
            <artifactId>protostuff-runtime</artifactId>
            <version>1.0.7</version>
        </dependency>

50,545

社区成员

发帖
与我相关
我的任务
社区描述
Java相关技术讨论
javaspring bootspring cloud 技术论坛(原bbs)
社区管理员
  • Java相关社区
  • 小虚竹
  • 谙忆
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧