2014-12-13 3 views
1

Я только что слышал об AspectJ, и это не выглядит слишком легко понять, поэтому я хочу знать заранее, если он (или что-то еще) поможет мне с моей проблемой или нет.AspectJ/Генерировать методы, используя отражение времени компиляции

У меня есть куча простых классов POJO и вы хотите написать для них двоичные сериализаторы, но без написания методов записи/чтения вручную для каждого класса. Я мог бы сделать это с помощью рефлексии, но это повлияет на производительность во время выполнения. Я считаю, что мне нужно что-то похожее на макросы в Scala с отражением во времени компиляции и квазикварталами.

Update: Я не могу использовать любой сериализации доступны, потому что у меня есть пользовательский двоичный протокол, который я не могу изменить (онлайн-игры)

Update 2:

Пример POJO с его read, write и некоторыми вспомогательными методами. Не окончательная версия, возможно, могут быть некоторые аннотации, например, но общая структура должна быть одинаковой. Я также опускал наследование для простоты, в действительности LoginPacket расширяет класс CommandPacket, который, в свою очередь, расширяет класс пакета.

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

+0

@ Demyx97, см. Update please – bobby

+0

Вы заинтересованы в ответе, который мог бы достоверно генерировать код, используя только источник (время предварительной компиляции)? –

ответ

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

Смежные вопросы