2014-12-13 60 views
1

我剛剛聽說AspectJ,它看起來不太容易理解,所以我想事先知道它是否會幫助我解決問題。AspectJ /使用編譯時反射生成方法

我有一堆簡單的POJO類,希望爲它們編寫二進制序列化程序,但不用手寫每個類的Write/Read方法。我可以在反射的幫助下完成,但這會影響運行時性能。我相信我需要一些類似於Scala中的Macroses的編譯時反射和quasiquotes。

更新: 我無法使用任何可用的序列化,因爲我有自定義的二進制協議,我不能修改(在線遊戲)

更新2:

例POJO與它的read,write和一些輔助方法。例如,不是最終版本,可能會有一些註釋,但一般結構應該是相同的。爲簡單起見,我也省略了繼承,實際上LoginPacket擴展了CommandPacket類,從而擴展了Packet類。

public class LoginPacket { 
    public short length; 
    public int sessionId; 
    public short command; 
    public short error; 
    public String reason; 

    private String getString(ByteBuffer data) { 
     short length = data.getShort(); 
     byte[] stringData = new byte[length]; 
     data.get(stringData); 
     return new String(stringData, "UTF-8"); 
    } 

    private void putString(ByteBuffer data, String someString) { 
     data.putShort(someString.length()); 
     byte[] stringData = someString.getBytes("UTF-8"); 
     data.put(stringData); 
    } 

    public static LoginPacket read(ByteBuffer data) { 
     LoginPacker loginPacket = new LoginPacket(); 
     loginPacket.length = data.getShort(); 
     loginPacket.sessionId = data.getInt(); 
     loginPacket.command = data.getShort(); 
     loginPacket.error = data.getShort(); 
     loginPacket.reason = getString(data); 
     return loginPacket; 
    } 

    public void write(ByteBuffer data) { 
     data.putShort(this.length); 
     data.putInt(this.sessionId); 
     data.putShort(this.command); 
     data.putShort(this.error); 
     putString(data, this.reason); 
    } 
} 
+0

你不能夠使用簡單的Java序列化? – Nikolai97 2014-12-13 18:27:21

+0

@ Demyx97,請參閱更新請求 – bobby 2014-12-13 19:49:33

+0

您是否對僅使用源代碼(預編譯時間)可靠地生成代碼的答案感興趣? – 2014-12-13 21:28:50

回答

1

我不認爲你需要使用AspectJ來修改你的類。我不明白使用編譯團隊編織會帶來什麼好處。我建議讓你的POJO使用implements Serializable,然後使用ObjectOutputStream序列化你的對象。

一個簡單的例子對象寫入到一個文件:

outputStream = new ObjectOutputStream(new FileOutputStream(filePath)); 
outputStream.writeObject(yourObject); 
... 
// do whatever else and close stream 

類似的問題:

  1. Saving to binary/serialization java
  2. Best way to store data for your game? (Images, maps, and such)
+0

對不起,我從一開始就沒有提到過這個。請參閱更新。 Java序列化也很慢。 – bobby 2014-12-13 19:50:31