Search code examples
javajsongsonflexjson

Flexjson or Gson : Protect object references after object serialization


I serializing a list with flexjson. After serialization, I printing object hashcode() and I would check to see if the objects are equal.

Problem, after the operation the object reference are changing. I don't want it.

My code;

    String sameOfString="sameOfString";
    List<Object> list=new ArrayList<Object>();
    list.add(sameOfString);
    list.add(sameOfString);
    list.add("differentString");

    for(Object str:list){
        System.out.println(str.hashCode());
    }
    **System.out.println(list.get(0)==list.get(1));**
    System.out.println(list.get(0)==list.get(2));
    System.out.println("--");
    String json= new JSONSerializer().exclude("*.class").deepSerialize(list);
    List<String> listDeserilized = (List<String>) new JSONDeserializer().deserialize(json);
    for(Object str:listDeserilized){
        System.out.println(str.hashCode());
    }
    **System.out.println(listDeserilized.get(0)==listDeserilized.get(1));**
    System.out.println(listDeserilized.get(0)==listDeserilized.get(2));

And output..

1018069468

1018069468

199675306

true

false

-

1018069468

1018069468

199675306

false

false

How can solve this problem?


Solution

  • I solved my problem with jackson lib.

    @JsonIdentityInfo annotation protecting object relations(in other words; protecting references) and after deserialization, object locations dont changing in memory.

    the final code :

    package com.maar.projectbuilder;
    
    import com.fasterxml.jackson.annotation.JsonIdentityInfo;
    import com.fasterxml.jackson.annotation.JsonTypeInfo;
    import com.fasterxml.jackson.annotation.JsonTypeName;
    import com.fasterxml.jackson.annotation.ObjectIdGenerators;
    import com.fasterxml.jackson.core.JsonProcessingException;
    import com.fasterxml.jackson.core.type.TypeReference;
    import com.fasterxml.jackson.databind.ObjectMapper;
    import com.fasterxml.jackson.databind.annotation.JsonDeserialize;
    
    import java.io.IOException;
    import java.util.ArrayList;
    import java.util.List;
    
    /**
     * Created by Firat on 11.9.2014.
     */
    public class Testt {
        @JsonDeserialize(as=StringClazz.class)
        @JsonTypeInfo(use=JsonTypeInfo.Id.CLASS, include=JsonTypeInfo.As.PROPERTY, property="@class")
        @JsonIdentityInfo(generator=ObjectIdGenerators.IntSequenceGenerator.class, property="@id")
        @JsonTypeName(value = "StringClazz")
        private static class StringClazz{
            private String data="";
    
            public StringClazz() {
            }
    
            public String getData() {
                return data;
            }
    
            public void setData(String data) {
                this.data = data;
            }
        }
        public static void main(String[] args) throws IOException {
            StringClazz someOfString=new StringClazz();
            someOfString.setData("someOfString");
            StringClazz differentString=new StringClazz();
            differentString.setData("differentString");
    
            List<StringClazz> list=new ArrayList<StringClazz>();
            list.add(someOfString);
            list.add(someOfString);
            list.add(differentString);
    
            for(Object str:list){
                System.out.println(str.hashCode());
            }
            System.out.println(list.get(0)==list.get(1));
            System.out.println(list.get(0)==list.get(2));
            System.out.println("-------");
            String json= null;
            try {
                json = new ObjectMapper().enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL).writeValueAsString(list);
            } catch (JsonProcessingException e) {
                e.printStackTrace();
            }
            System.out.println(json);
            List<StringClazz> listDeserilized =new ObjectMapper().enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL).readValue(json, new TypeReference<List<StringClazz>>() {
            });
            for(Object str:listDeserilized){
                System.out.println(str.hashCode());
            }
            System.out.println(listDeserilized.get(0)==listDeserilized.get(1));
            System.out.println(listDeserilized.get(0)==listDeserilized.get(2));
        }
    }