2010-07-11 3 views
0

У меня есть сериализованный объект, который необходимо преобразовать в объект «blob» и сохранить в базе данных. Раньше мы использовали для хранения объекта, который был определен другими объектами проекта, но выполняли правила сериализации, из-за которых он сталкивался с многочисленными проблемами, поэтому мы решили изменить объект структуры blob, который теперь содержит только примитивные объекты (String, boolean, Integer и т. д.). До сих пор мы могли заставить весь атрибут ожидать два.Проблема в преобразовании объекта в объект Blob

private byte[] encode(ScheduledReport schedSTDReport) 
{ 
    byte[] bytes = null; 
    try 
    { 
     ByteArrayOutputStream bos = new ByteArrayOutputStream(); 
     ObjectOutputStream oos = new ObjectOutputStream(bos); 
     oos.writeObject(schedSTDReport); 
     oos.flush(); 
     oos.close(); 
     bos.close(); 
     //byte [] data = bos.toByteArray(); 
     //ByteArrayOutputStream baos = new ByteArrayOutputStream(); 
     //GZIPOutputStream out = new GZIPOutputStream(baos); 
     //XMLEncoder encoder = new XMLEncoder(out); 
     //encoder.writeObject(schedSTDReport); 
     //encoder.close(); 
     bytes = bos.toByteArray(); 
     //GZIPOutputStream out = new GZIPOutputStream(bos); 
     //out.write(bytes); 
     //bytes = bos.toByteArray(); 

    } 

выше пишут блоб Blob содержит

public class ScheduledReport extends ScheduledReportInfo implements Serializable { 



    private SupervisoryScope     _scope   = null; 
    private Report        _attributes  = null; 
    private ScheduledReportScheduleBase  _schedule  = null; 
    private HashMap       selectionList = new HashMap(); 
    private EmailInfo       _emailInfo  = null; 
    private String        _pdfFileName = null; 
    private short        _baseDateOffset = -1;  

В объекте отчета существует follwoing атрибута

private String  deflt = null; 
private Object  guiValue = null; 
protected Object serverValue = null; 

изменяемый объект может быть любой, как список массива, строка, логическим или объект класса. Но как только декодировать на фактический объект, ему нужно ввести cast в любой тип, который он есть. Наша цель - преобразовать этот объект в любой примитивный тип и сохранить и возвращать обратно в качестве исходного значения. По существу мы думали, что каждый объект как строка с типом объекта присоединяется к нему подобно «1_integer», «Y_Boolean» и преобразуется в blob и при возобновлении разделительной строки и использует эту строку как часть отражения, чтобы получить тип объекта для кастинга. Но это нецелесообразное или правильное решение. Есть идеи.

ответ

2

Не было бы проще, если бы вы сломали свой объект и сохранили отдельные поля, а не 1 большой кусок данных?

С другой стороны, вы можете попробовать Hibernate. Эта структура в основном позволяет хранить объекты в реляционных базах данных, а затем позволяет автоматически воссоздать объект из реляционной базы данных. Он прост в использовании, пример, который я добавляю, был получен от here

package org.kodejava.example.hibernate.app; 

import java.util.Date; 

import org.hibernate.Session; 

public class LabelManager { 
    private Label getLabel(Long id) { 
     Session session = SessionFactoryHelper.getSessionFactory().getCurrentSession(); 

     session.beginTransaction(); 

     /* 
     * We get back Label object from database by calling the Session object 
     * get() method and passing the object type and the object id to be 
     * read. 
     */ 
     Label label = (Label) session.get(Label.class, id); 
     session.getTransaction().commit(); 

     return label; 
    } 

    private void saveLabel(Label label) { 
     /* 
     * To save an object we first get a session by calling getCurrentSession() 
     * method from the SessionFactoryHelper class. Next we create a new 
     * transcation, save the Label object and commit it to database, 
     */ 
     Session session = SessionFactoryHelper.getSessionFactory().getCurrentSession(); 

     session.beginTransaction();   
     session.save(label);   
     session.getTransaction().commit(); 
    } 

    public static void main(String[] args) {   
     LabelManager manager = new LabelManager(); 

     /* 
     * Creates a Label object we are going to stored in the database. We 
     * set the name, modified by and modified date information. 
     */ 
     Label label = new Label(); 
     label.setName("Sony Music"); 
     label.setModifiedBy("admin"); 
     label.setModifiedDate(new Date()); 

     /* 
     * Call the LabelManager saveLabel method. 
     */ 
     manager.saveLabel(label); 

     /* 
     * Read the object back from database. 
     */ 
     label = manager.getLabel(label.getId()); 
     System.out.println("Label = " + label); 
    }  
} 
Смежные вопросы