簡體   English   中英

使用UTF-8將Java對象序列化為字符串

[英]Serialize Java Object into String using UTF-8

我正在嘗試編寫一個使用UTF-8編碼將Java對象序列化為String的函數。 這是我的實現:

public static String serializeToString(DefaultMutableTreeNode tree) {
    ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
    try {
        ObjectOutput out = new ObjectOutputStream(byteArrayOutputStream);
        out.writeObject(tree);
        return byteArrayOutputStream.toString("UTF-8");
    } catch (IOException e) {
        return null;
    }
}

但是,它似乎不起作用。 我試圖將生成的String傳遞到僅接受UTF-8編碼但由於編碼問題而失敗的數據庫。

我的問題是:

  1. 我的實施有什么問題?
  2. 如何檢查結果字符串是否為UTF-8?

非常感謝

問候

這不是一個好主意,任意二進制數組並不總是轉換為有效的UTF-8序列。 您應該將數組作為二進制Blob放入數據庫中,或者將數組轉換為類似Base64編碼的字符串。

您一定會在字符串中得到不可打印的字符,DB根本不會喜歡這些字符。 Java ByteArrayOutputStream文檔的排序提示可能會將無法打印的字符重新編碼為可打印,但是在代碼中,我看不到除了停止程序並出現錯誤之外沒有任何作用。 我也看不到您將來如何使用這樣的字符串。

字節的256個可能值中只有一部分(大約四分之一)是有效的ASCII字符。 大多數數據庫不會將它們作為字符串的一部分。 因此,您的錯誤消息。 (Unicode和UTF-8有相同的問題。)

我曾經通過將每6位轉換為一個包含可打印字符的字節來將二進制數據轉換為可打印字符來將二進制數據存儲在數據庫中。 但是我使用了簡單的ASCII編碼,並且編寫了將字符轉換二進制的代碼。 然后,我能夠將二進制數據存儲在數據庫字符列中,並在以后檢索它。 我寧願被逼進去; 我不建議您這樣做。

如果要查看“字符字符串”的樣子,只需將每個字節打印為整數,然后將其與ASCII表進行比較即可。 您可能會發現問題而無需考慮Unicode的優點。

我正在嘗試編寫一個使用UTF-8編碼將Java對象序列化為String的函數。

是的……您的代碼實際上正在執行的操作是將對象序列化為字節,然后告訴String構造函數“這些字節是某些Unicode代碼點的有效UTF-8編碼”。 問題是(通常來說)它們不是...,並且當UTF-8解碼器嘗試將它們轉換為Java String中使用的UTF-16表示形式時,它會找到無效的序列並將其替換為“無效”字符”代碼點。

如果要將任意字節表示為Java字符串,則需要使用諸如base64編碼之類的東西。 更好的主意是將字節作為Blob放入數據庫。

暫無
暫無

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

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