如何使用ObjectOutputStream.writeObject()+Base64 (Java)深度序列化对象?

How to deep serialize object using ObjectOutputStream.writeObject()+Base64 (Java)?

我需要在 java 中序列化一个对象。目前我正在使用 this code 来做到这一点:

  1. ObjectOutputStream.writeObject(obj);
  2. Base64 编码对象

并逆转这个过程。

它适用于 class 内的原始类型 ,例如 longint

但是,该对象内的所有 String 对象都变为 null 我也需要将它们包括在内。有什么办法吗?

编辑:我正在使用的代码

// Modified from source: 
public static Object FromString( String s )
{
    Object o = null;
    try {
        byte[] data = Base64.getDecoder().decode(s);
        ObjectInputStream ois = new ObjectInputStream(
                new ByteArrayInputStream(data));
        o = ois.readObject();
        ois.close();
    }
    catch(Exception e)
    {
        System.out.println(e);
    }
    return o;
}

// Modified from source: 
public static String ToString( Serializable o )
{
    ByteArrayOutputStream baos = null;
    try {
        baos = new ByteArrayOutputStream();
        ObjectOutputStream oos = new ObjectOutputStream(baos);
        oos.writeObject(o);
        oos.close();
    }
    catch(Exception e)
    {
        System.out.println(e);
    }

    return Base64.getEncoder().encodeToString(baos.toByteArray());
}

编辑:Pojo

public class SignedTimestamp implements Serializable {

    private Long obj;
    private byte[] signature;
    private String signatureAsAString;
}

其他应用程序的输出(接收数据并反序列化):

obj = 1494609033621;

signature = null;

signatureAsAString = null;

我没有发现该代码有任何问题。请 post 您的代码,以便我们进一步挖掘。

从我这边开始尝试:

编码序列化版本 rO0ABXNyAAhFbXBsb3llZTLR4JLRYAw9AgAESQAGbnVtYmVyTAAHYWRkcmVzc3QAEkxqYXZhL2xhbmcvU3RyaW5nO0wADWFkZHJlc3NPYmplY3R0AAlMQWRkcmVzcztMAARuYW1lcQB+AAF4cAAAAGV0ABlQaG9ra2EgS3VhbiwgQW1iZWh0YSBQZWVyc3IAB0FkZHJlc3MkcEtPHXHTqQIAAUwACGFkZHJMaW5lcQB+AAF4cHEAfgAEdAAJUmV5YW4gQWxp

重构对象 员工 [name=Reyan Ali, address=Phokka Kuan, Ambehta Peer, number=101, addressObject=Address [addrLine=Phokka Kuan, Ambehta Peer]]

我刚刚测试了你的代码,它工作正常。

我创建了一个名为 SignedTimeStamp.java:

的源
import java.io.*;

public class SignedTimestamp implements Serializable {
    private Long obj;
    private byte[] signature;
    private String signatureAsAString;

    public SignedTimestamp(Long obj, byte[] signature, String signatureAsAString) {
        this.obj = obj;
        this.signature = signature;
        this.signatureAsAString = signatureAsAString;
    }

    public Long getObj() {
        return this.obj;
    }

    public byte[] getSignature() {
        return this.signature;
    }

    public String getSignatureAsAString() {
        return this.signatureAsAString;
    }

}

并声明另一个名为 Serializables.java,其中包含您的代码: 导入 java.io.; 导入 java.util.;

public class Serializables {
    public static Object FromString(String s) {
        Object o = null;
        try {
            byte[] data = Base64.getDecoder().decode(s);
            ObjectInputStream ois = new ObjectInputStream(
                    new ByteArrayInputStream(data));
            o = ois.readObject();
            ois.close();
        }
        catch(Exception e)
        {
            System.out.println(e);
        }
        return o;
    }

    // Modified from source: 
    public static String ToString( Serializable o ) {
        ByteArrayOutputStream baos = null;
        try {
            baos = new ByteArrayOutputStream();
            ObjectOutputStream oos = new ObjectOutputStream(baos);
            oos.writeObject(o);
            oos.close();
        }
        catch(Exception e)
        {
            System.out.println(e);
        }

        return Base64.getEncoder().encodeToString(baos.toByteArray());
    }
}

然后,我在Serialize.java中创建了一个主要的class:

public class Serialize {

    public static void main(String[] args) throws Exception {
        SignedTimestamp o = new SignedTimestamp(100L, new byte[]{ (byte) 128 }, "Hello, world!");
        System.out.println(Serializables.ToString(o));
    }
}

返回我这个结果:

sh-4.3$ java Serialize
rO0ABXNyAA9TaWduZWRUaW1lc3RhbXCGTHiJ+JenzgIAA0wAA29ianQAEExqYXZhL2xhbmcvTG9uZztbAAlzaWduYXR1cmV0AAJbQkwAEnNpZ25hdHVyZUFzQVN0cmluZ3QAEkxqYXZhL2xhbmcvU3RyaW5nO3hwc3IADmphdmEubGFuZy
5Mb25nO4vkkMyPI98CAAFKAAV2YWx1ZXhyABBqYXZhLmxhbmcuTnVtYmVyhqyVHQuU4IsCAAB4cAAAAAAAAABkdXIAAltCrPMX+AYIVOACAAB4cAAAAAGAdAANSGVsbG8sIHdvcmxkIQ==                                    
sh-4.3$ 

然后,我在Deserialize.java中创建了另一个主class:

public class Deserialize {

    public static void main(String[] args) throws Exception {
        String serialized = 
            "rO0ABXNyAA9TaWduZWRUaW1lc3RhbXCGTHiJ+JenzgIAA0wAA29ianQAEExqYXZhL2xhbmcvTG9uZztbAAlzaWduYXR1cmV0AAJbQkwAEnNpZ25hdHVyZUFzQVN0cmluZ3QAEkxqYXZhL2xhbmcvU3RyaW5nO3hwc3IADmphdmEubGFuZy" +
            "5Mb25nO4vkkMyPI98CAAFKAAV2YWx1ZXhyABBqYXZhLmxhbmcuTnVtYmVyhqyVHQuU4IsCAAB4cAAAAAAAAABkdXIAAltCrPMX+AYIVOACAAB4cAAAAAGAdAANSGVsbG8sIHdvcmxkIQ==";
        SignedTimestamp o = (SignedTimestamp) Serializables.FromString(serialized);

        System.out.println(o.getObj());
        System.out.println(o.getSignature());
        System.out.println(o.getSignatureAsAString());
    }

}

它 returns 这个:

sh-4.3$ java Deserialize                                                                                                                                                          
100                                                                                                                                                                               
[B@6bc7c054                                                                                                                                                                       
Hello, world!                                                                                                                                                                     
sh-4.3$ 

因此,总而言之,代码似乎运行良好。 你是如何测试你的代码的?可能是哪里出错了。