簡體   English   中英

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

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

我需要在Java中序列化一個對象。 目前,我正在通過使用以下代碼來做到這一點:

  1. ObjectOutputStream.writeObject(obj);
  2. Base64編碼obj

並逆轉過程。

對於類內部的原始類型 ,例如longint它可以正常工作

但是,該對象內的所有String對象都變為null 我也需要將它們包括在內。 有什么辦法嗎?

編輯:我正在使用的代碼

// Modified from source: https://stackoverflow.com/questions/134492/how-to-serialize-an-object-into-a-string
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: https://stackoverflow.com/questions/134492/how-to-serialize-an-object-into-a-string
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;

簽名= null;

signatureAsAString = null;

我在該代碼中看不到任何問題。 請發布您的代碼,以便我們進一步研究。

從我的一端嘗試過:

編碼序列化版本rO0ABXNyAAhFbXBsb3llZTLR4JLRYAw9AgAESQAGbnVtYmVyTAAHYWRkcmVzc3QAEkxqYXZhL2xhbmcvU3RyaW5nO0wADWFkZHJlc3NPYmplY3R0AAlMQWRkcmVzcztMAARuYW1lcQB + AAF4cAAAAGV0ABlQaG9ra2EgS3VhbiwgQW1iZWh0YSBQZWVyc3IAB0FkZHJlc3MkcEtPHXHTqQIAAUwACGFkZHJMaW5lcQB + AAF4cHEAfgAEdAAJUmV5YW4gQWxp

重組對象Employee [名稱= Reyan Ali,地址= Phokka Kuan,Ambehta Peer,數字= 101,addressObject =地址[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 ,其中包含您的代碼:importjava.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: http://stackoverflow.com/questions/134492/how-to-serialize-an-object-into-a-string
    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中創建了一個主類:

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中創建了另一個主類:

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());
    }

}

它返回此:

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

因此,總而言之,代碼似乎運行良好。 您是如何測試代碼的? 也許錯誤在那里。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM