2010-07-11 63 views
0

我有一個需要轉換爲「blob」對象並存儲到數據庫中的序列化對象。以前我們用來存儲一個由其他項目對象定義的對象,但是它遵循序列化規則,因爲它遇到了很多問題,所以我們決定改變現在只包含原始對象的結構「blob」對象(String,布爾值,整數等)。到目前爲止,我們可以使所有的屬性期望兩個將對象轉換爲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(); 

    } 

上述被寫入團塊 斑點包含

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; 

可變對象可以有任何形式的陣列列表,字符串,布爾或一個類對象。 但是,一旦解碼爲實際對象,它就需要將類型轉換爲任意類型。我們的目標是將此對象轉換爲原始類型和存儲中的任何一種,並將其作爲原始值恢復。基本上我們認爲每個對象都是以對象類型附加的字符串的形式附加到它上面,如'1_整數','Y_Boolean'並轉換爲blob,同時恢復拆分字符串並將該字符串用作反射的一部分以獲取用於投射的對象類型。但這不是可行或正確的解決方案。有任何想法嗎。

回答

2

如果你拋棄了你的對象並存儲了單獨的字段而不是一大塊數據,這不是更簡單嗎?

另一方面,你可能想嘗試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); 
    }  
}