Ist es möglich, struct-like Konstrukte in Java zu verwenden?

7

Ich erwäge, Java für ein großes Projekt zu verwenden, aber ich konnte nichts finden, was Strukturen in Java entfernt darstellt. Ich muss in der Lage sein, Netzwerkpakete in Strukturen / Klassen zu konvertieren, die in der Anwendung verwendet werden können.

Ich weiß, dass es möglich ist, RandomAccessFile zu verwenden, aber dieser Weg ist NICHT akzeptabel. Also bin ich neugierig, ob es möglich ist, eine Menge von Bytes in eine Struktur zu "werfen", wie ich es in C tun könnte. Wenn das nicht möglich ist, kann ich Java nicht verwenden.

Die Frage, die ich stelle, ist also, ob es möglich ist, ausgerichtete Daten ohne zusätzlichen Aufwand in eine Klasse zu übertragen, außer dass die Ausrichtung und die Datentypen spezifiziert sind.

    
Kristina Brooks 31.07.2011, 19:10
quelle

8 Antworten

9

Sie fragen grundsätzlich, ob Sie eine C-spezifische Lösung für ein Problem in einer anderen Sprache verwenden können. Die Antwort ist, vorhersehbar, "Nein".

Es ist jedoch durchaus möglich, eine Klasse zu konstruieren, die in ihrem Konstruktor eine Menge von Bytes akzeptiert und eine entsprechende Instanz erstellt.

%Vor%

Sie können sicherstellen, dass Klasseninstanzen eins-zu-eins auf Byte-Arrays abgebildet werden. Fügen Sie eine toBytes () - Methode hinzu, um eine Instanz in Bytes zu serialisieren.

    
Confusion 31.07.2011, 19:18
quelle
15

Nein. Sie können ein Array von Bytes nicht an ein Klassenobjekt übergeben.

Davon abgesehen können Sie eine java.nio.Buffer und extrahieren Sie einfach die Felder, die Sie für ein Objekt benötigen:

%Vor%     
dacwe 31.07.2011 19:13
quelle
4

Nein, das kannst du nicht tun. Java hat einfach nicht die gleichen Konzepte wie C.

Sie können eine Klasse erstellen, die sich ähnlich wie eine Struktur verhält:

%Vor%

und Sie können einen Konstruktor haben, der ein Array oder Bytes oder ein DataInput benötigt, um die Bytes zu lesen:

%Vor%

Lesen Sie dann Bytes vom Draht und pumpen Sie sie in Structures :

%Vor%

Es ist nicht so prägnant wie C, aber es ist ziemlich nah. Beachten Sie, dass die DataInput -Schnittstelle sauberes Entfernen mit Endianness in Ihrem Namen entfernt, was definitiv einen Vorteil gegenüber C darstellt.

    
Cameron Skinner 31.07.2011 19:19
quelle
1

Es gibt nichts, was Ihrer Beschreibung entspricht.

Einer Struktur in Java ist eine einfache Klasse am nächsten, die Werte enthält, auf die entweder über ihre Felder oder über set / get-Methoden zugegriffen werden kann.

Das typische Mittel zum Konvertieren zwischen Java-Klasseninstanzen und On-the-Wire-Darstellungen ist die Java-Serialisierung, die je nach Bedarf stark angepasst werden kann. Es ist das, was von Java's Remote Method Invocation API benutzt wird und funktioniert sehr gut.

    
Joshua Kaplan 31.07.2011 19:13
quelle
1
Wie Joshua sagt, ist Serialisierung der typische Weg, um solche Dinge zu tun. Allerdings gibt es andere binäre Protokolle wie MessagePack, ProtocolBuffers und AvRO.

Wenn Sie mit den Bytecode-Strukturen spielen wollen, sehen Sie sich ASM und CGLIB an; Diese sind sehr häufig in Java-Anwendungen.

    
Ray Toal 31.07.2011 19:20
quelle
1
%Vor%     
Vlad 31.07.2011 19:20
quelle
0

Nein, das ist nicht möglich. Sie versuchen, Java wie C zu verwenden, was zu Komplikationen führen kann. Entweder lernen Sie, Dinge auf Java-Art zu tun, oder gehen Sie zurück zu C.

In diesem Fall würde der Java-Weg wahrscheinlich DataInputStream beinhalten und / oder DataOutputStream .

    
Mike Baranczak 31.07.2011 19:20
quelle
0

Sie können Array von Bytes nicht in Instanzen der Klasse umwandeln. Aber Sie können viel mehr mit Java tun. Java hat einen internen, sehr starken und sehr flexiblen Mechanismus der Serialisierung. Das ist was du brauchst. Sie können Objekte in / aus dem Stream lesen und schreiben.

Wenn beide Seiten in Java geschrieben sind, gibt es überhaupt kein Problem. Wenn eine der Seiten nicht Java ist, können Sie Ihre Serialisierung anpassen. Beginnen Sie mit dem Lesen von Javadoc von java.util.Serializable.

    
AlexR 31.07.2011 19:23
quelle

Tags und Links