替代内部字段的序列化

时间:2014-01-10 16:30:46

标签: java serialization deserialization


如果发出相同的程序,但仅对字段bar的数据结构进行单一更改而有所不同。

  1. bar表示相同的值HelloWorld时,序列化是否会有所不同?
  2. 序列化/反序列化过程是否不能在不同版本之间交换?
  3. 示例:

    //bar only represents "HelloWorld"
    
    //Program 1 field is String
    Class foo{
        String bar; //"HelloWorld"
    }
    
    //Program 2 field is Character[]
    Class foo{
        Character[] bar; //{H','e','l','l','o','W','o','r','l','d'}
    }
    
    //Program 3 field is ArrayList<Character>
    Class foo{
        Arraylist<Character> bar; //{{put('H');put('e');put('l');put('l');put('o');put('W');put('o');put('r');put('l');put('d')}}
    }
    

    我在这里谈论和寻找的是否有名称或术语?

1 个答案:

答案 0 :(得分:0)

Java不允许您在同一个包中拥有多个同名的类。当您尝试编译示例时,您应该会看到“foo已定义”之类的错误。

Java Serialization包含类,因此序列化为“foo”类不能随后反序列化为不同的“foo2”类。这也意味着“foo”的序列化将始终不同于“foo2”的序列化。

如果你的目标是让一个“foo”类将它的String暴露为字符数组或者ArrayList,你可以在一个类中完成所有这些操作。

import java.util.*; 

public class TooManyFoo {
    private final String bar;

    public TooManyFoo( String bar ) {
        this.bar = bar;
    }

    public String getBar() {
        return bar;
    }

    public Character[] getBarAsArray() {
        Character[] barAsArray = new Character[bar.length()];
        for ( int i = 0; i < barAsArray.length; i++ ) {
            barAsArray[i] = Character.valueOf( bar.charAt( i ) );
        }
        return barAsArray;
    }

    public List<Character> getBarAsList() {
        List<Character> barAsList = new ArrayList<Character>();
        for ( char c : bar.toCharArray() ) {
            barAsList.add( Character.valueOf( c ) );
        }
        return barAsList;
    }
}

另一方面,大多数开发人员只希望通过getter直接在foo中使用String栏。

我的观点是,Java序列化包括类,因此您必须反序列化到同一个类中。