Как сериализовать объект в строку

Хотя это не совсем точно для селекторов / объектов jQuery, в FireFox Quantum 58.x вы можете найти обработчики событий для элемента с помощью инструментов Dev:

  1. Щелкните правой кнопкой мыши Элемент
  2. В контекстном меню нажмите «Осмотреть элемент»
  3. Если рядом с элементом есть значок «ev», щелкните значок «ev» [/] g3]
  4. Отображает все события для этого элемента и обработчика событий

142
задан casperOne 19 December 2011 в 19:25
поделиться

11 ответов

Sergio:

необходимо использовать BLOB. Это довольно просто с JDBC.

проблемой со вторым кодом, который Вы отправили, является кодирование. Необходимо дополнительно закодировать байты для проверки ни одного в них сбои.

, Если Вы все еще хотите записать его в Строку, можно закодировать байты с помощью java.util. Base64.

Все еще необходимо использовать CLOB в качестве типа данных, потому что Вы не знаете, сколько времени сериализированные данные будут.

Вот образец того, как использовать его.

import java.util.*;
import java.io.*;

/** 
 * Usage sample serializing SomeClass instance 
 */
public class ToStringSample {

    public static void main( String [] args )  throws IOException,
                                                      ClassNotFoundException {
        String string = toString( new SomeClass() );
        System.out.println(" Encoded serialized version " );
        System.out.println( string );
        SomeClass some = ( SomeClass ) fromString( string );
        System.out.println( "\n\nReconstituted object");
        System.out.println( some );


    }

    /** Read the object from Base64 string. */
   private static Object fromString( String s ) throws IOException ,
                                                       ClassNotFoundException {
        byte [] data = Base64.getDecoder().decode( s );
        ObjectInputStream ois = new ObjectInputStream( 
                                        new ByteArrayInputStream(  data ) );
        Object o  = ois.readObject();
        ois.close();
        return o;
   }

    /** Write the object to a Base64 string. */
    private static String toString( Serializable o ) throws IOException {
        ByteArrayOutputStream baos = new ByteArrayOutputStream();
        ObjectOutputStream oos = new ObjectOutputStream( baos );
        oos.writeObject( o );
        oos.close();
        return Base64.getEncoder().encodeToString(baos.toByteArray()); 
    }
}

/** Test subject. A very simple class. */ 
class SomeClass implements Serializable {

    private final static long serialVersionUID = 1; // See Nick's comment below

    int i    = Integer.MAX_VALUE;
    String s = "ABCDEFGHIJKLMNOP";
    Double d = new Double( -1.0 );
    public String toString(){
        return  "SomeClass instance says: Don't worry, " 
              + "I'm healthy. Look, my data is i = " + i  
              + ", s = " + s + ", d = " + d;
    }
}

Вывод:

C:\samples>javac *.java

C:\samples>java ToStringSample
Encoded serialized version
rO0ABXNyAAlTb21lQ2xhc3MAAAAAAAAAAQIAA0kAAWlMAAFkdAASTGphdmEvbGFuZy9Eb3VibGU7T
AABc3QAEkxqYXZhL2xhbmcvU3RyaW5nO3hwf////3NyABBqYXZhLmxhbmcuRG91YmxlgLPCSilr+w
QCAAFEAAV2YWx1ZXhyABBqYXZhLmxhbmcuTnVtYmVyhqyVHQuU4IsCAAB4cL/wAAAAAAAAdAAQQUJ
DREVGR0hJSktMTU5PUA==


Reconstituted object
SomeClass instance says: Don't worry, I'm healthy. Look, my data is i = 2147483647, s = ABCDEFGHIJKLMNOP, d = -1.0

ПРИМЕЧАНИЕ : для Java 7 и ранее Вы видите, что оригинал отвечает здесь

261
ответ дан Community 19 December 2011 в 19:25
поделиться

Как насчет того, чтобы писать данные в ByteArrayOutputStream вместо FileOutputStream?

Иначе, Вы могли сериализировать объект с помощью XMLEncoder, сохранить XML, затем десериализовать через XMLDecoder.

12
ответ дан Outlaw Programmer 19 December 2011 в 19:25
поделиться
  • 1
    Похож на ответвление, был уже удален. получение по запросу мерзавца won' t удаляют удаленно удаленные ответвления, необходимо использовать чернослив: мерзавец удаленный источник чернослива - stay-calm.blogspot.com/2009/02/… – Josh 9 May 2011 в 10:08

Спасибо за большие и быстрые ответы. Я буду давать, некоторые голосуют сразу для подтверждения справки. Я кодировал лучшее решение, по-моему, на основе Ваших ответов.

LinkedList<Patch> patches1 = diff.patch_make(text2, text1);
try {
    ByteArrayOutputStream bos = new ByteArrayOutputStream();
    ObjectOutputStream os = new ObjectOutputStream(bos);
    os.writeObject(patches1);
    String serialized_patches1 = bos.toString();
    os.close();


    ByteArrayInputStream bis = new ByteArrayInputStream(serialized_patches1.getBytes());
    ObjectInputStream oInputStream = new ObjectInputStream(bis);
    LinkedList<Patch> restored_patches1 = (LinkedList<Patch>) oInputStream.readObject();            



        // patches1 equals restored_patches1
    oInputStream.close();
} catch(Exception ex) {
    ex.printStackTrace();
}

Примечание я не сделал рассмотренного использование JSON, потому что менее эффективно.

Примечание: я буду, рассмотрел Ваш совет о не хранении сериализованного объекта как строки в базе данных, но байте [] вместо этого.

7
ответ дан Sergio del Amo 19 December 2011 в 19:25
поделиться
  • 1
    Комментарий выше меня должен быть самым высоким расчетным ответом здесь. Конечно, Nathan' s работы метода, но это скрывает истинную ошибку здесь. – fforw 15 December 2011 в 00:00

Как насчет того, чтобы сохранить объект как блоб

4
ответ дан Kristian 19 December 2011 в 19:25
поделиться
  • 1
    Я удалил локально сначала с командой: мерзавец $ переходит-d-r источник / социальный или, я делал это неправильно? – Himel 24 May 2010 в 09:38

Сериализованный поток является просто последовательностью байтов (октеты). Таким образом, вопрос состоит в том, как преобразовать последовательность байтов к Строке, и назад снова. Далее это должно использовать ограниченный набор кодов символов, если это будет сохраненным в базе данных.

очевидное решение проблемы состоит в том, чтобы изменить поле на двоичный LOB. Если Вы захотите придерживаться characer LOB, то необходимо будет закодировать в некоторой схеме, такой как base64, шестнадцатеричное число или uu.

1
ответ дан Tom Hawtin - tackline 19 December 2011 в 19:25
поделиться
  • 1
    Право, была опечатка, на самом деле я записал его здесь. но в фактической консоли я применил его правильный. – Himel 24 May 2010 в 09:46

XStream обеспечивает простую утилиту для сериализации/десериализации к/от XML, и это очень быстро. Хранение XML CLOBs, а не двоичных БЛОБОВ будет менее хрупким, не говоря уже о более читаемом.

4
ответ дан skaffman 19 December 2011 в 19:25
поделиться
  • 1
    Спасибо. На самом деле я заметил это решение и попробовал ранее. Но это дает следующую ошибку... Мерзавец $ продвигает источник: heads/socail Вводят пароль для ключа '/h/.ssh/id_rsa': ошибка: неспособный продвинуть неподготовленному месту назначения: heads/socail целевой refspec не соответствует существующему касательно на удаленном и не начинается с судей/, и мы неспособны предположить префикс на основе источника касательно ошибки: не удалось продвинуть некоторых судей к ' git@xxxxxx.git' – Himel 24 May 2010 в 09:37

Можно использовать сборку в классах sun.misc. Base64Decoder и sun.misc. Base64Encoder для преобразования двоичных данных сериализирования к строке. Вы десяти кубометров не нужны дополнительные классы, потому что это - сборка в.

1
ответ дан 19 December 2011 в 19:25
поделиться
  • 1
    спасибо за справку, именно это я сделал и это работало – adhanlon 25 January 2010 в 04:45

можно использовать Кодирование программой uuencode

0
ответ дан CiNN 19 December 2011 в 19:25
поделиться

Используйте платформу O/R такой, поскольку в спящем режиме

-2
ответ дан Kristian 19 December 2011 в 19:25
поделиться

Если Вы храните объект как двоичные данные в базе данных, то действительно необходимо использовать BLOB тип данных. База данных в состоянии сохранить его более эффективно, и Вы не должны волноваться о кодировке и т.п.. JDBC предоставляет методы для создания и получения блобов с точки зрения потоков. Используйте Java 6, если Вы можете, он сделал некоторые дополнения к API JDBC, которые делают контакт с блобами намного легче.

, Если бы абсолютно необходимо хранить данные как Строку, я рекомендовал бы XStream для основанного на XML устройства хранения данных (намного легче, чем XMLEncoder), но альтернативные объектные представления могли бы быть так же, как полезные (например, JSON). Ваш подход зависит от того, почему на самом деле необходимо хранить объект таким образом.

3
ответ дан Daniel Spiewak 19 December 2011 в 19:25
поделиться
  • 1
    Это doesn' t имеют значение, что Вы удаляете локально или нет, Вы замечали, что Ваш последний пример имеет опечатку socail/social? – Arkaitz Jimenez 24 May 2010 в 09:40

Смотрите на java.sql. Класс PreparedStatement, конкретно функция

http://java.sun.com/javase/6/docs/api/java/sql/PreparedStatement.html#setBinaryStream (интервал, %20java.io. InputStream)

Тогда смотрят на java.sql. Класс ResultSet, конкретно функция

http://java.sun.com/javase/6/docs/api/java/sql/ResultSet.html#getBinaryStream (интервал)

Имеет в виду при сериализации объекта в базу данных, и затем изменение объекта в коде в новой версии процесс десериализации может легко перестать работать потому что измененная подпись объекта. Я когда-то сделал эту ошибку с хранением пользовательские сериализированные Предпочтения и затем внесение изменения в Предпочтительное определение. Внезапно я не мог считать ни одну ранее сериализированную информацию.

Вы могли бы быть более обеспеченной записью, неуклюжей на столбцы свойства в таблице и создании и разложении объекта этим способом вместо этого, для предотвращения этой проблемы с версиями объекта и десериализацией. Или запись свойств в hashmap какое-то, как java.util. Объект свойств и затем сериализация объекта свойств, который крайне маловероятно изменится.

1
ответ дан Josh 19 December 2011 в 19:25
поделиться
  • 1
    Я понимаю, что слишком опаздываю стороне, но этот regex неправильно идентифицировал бы /* rubbish */ */ как полный комментарий блока (от /* до 2-го */), в противоположность комментариям блока стиля C, в которых открытие /* завершается самым близким закрытием */, и другой */ идентифицируется как случайный символ в программе. Следующий regex (для гибкого провода/закона) обрабатывает этот случай также "/*"((("*"[^/])?)|[^*])*"*/" Источник - [ссылка] ( stackoverflow.com/questions/16160190/… ) – Shobhit 11 February 2014 в 07:13
Другие вопросы по тегам:

Похожие вопросы: