Commit ebb7f2d0 authored by tammam.alsoleman's avatar tammam.alsoleman

Encoding & Decoding & Comparison with JSON

parent 99843415
package org.example; package org.example;
import com.google.protobuf.InvalidProtocolBufferException; import com.google.protobuf.InvalidProtocolBufferException;
import org.ds.proto.Author; import org.ds.proto.*;
import org.ds.proto.Book;
import org.ds.proto.BookType; import java.util.Arrays;
import org.ds.proto.Library;
public class Main { public class Main {
public static void main(String[] args) throws InvalidProtocolBufferException { public static void main(String[] args) {
byte[] msg = sender(); System.out.println("Protocol Buffers Encoding & Decoding Demo\n");
receiver(msg);
// 1. ترميز وفك تشفير كتاب مفرد
encodeDecodeSingleBook();
System.out.println("\n" + "=".repeat(50) + "\n");
// 2. ترميز وفك تشفير مكتبة (مجموعة كتب)
encodeDecodeLibrary();
System.out.println("\n" + "=".repeat(50) + "\n");
// 3. ترميز وفك تشفير طلبات الخدمة
encodeDecodeServiceMessages();
} }
private static void receiver(byte[] msg) throws InvalidProtocolBufferException { private static void encodeDecodeSingleBook() {
System.out.println("Received Data:"); System.out.println("1. Single Book Encoding & Decoding:");
// Display binary data
for (int i = 0; i < msg.length; i++) { try {
System.out.print(msg[i] + " "); // 🔹 الخطوة 1: إنشاء كائن Book
Book originalBook = Book.newBuilder()
.setTitle("Designing Data-Intensive Applications")
.setAuthor(Author.newBuilder()
.setName("Martin Kleppmann")
.setCountry("United Kingdom")
.build())
.setIsbn("978-1449373320")
.setYear(2017)
.setType(BookType.TECHNICAL)
.addAllCategories(Arrays.asList("Databases", "Distributed Systems", "Software Architecture"))
.setAvailable(true)
.build();
System.out.println(" Original Book Created:");
printBookDetails(originalBook, " ");
// 🔹 الخطوة 2: الترميز إلى مصفوفة بايتات
byte[] encodedData = originalBook.toByteArray();
System.out.println(" Encoding to byte array...");
System.out.println(" Encoded size: " + encodedData.length + " bytes");
System.out.print(" Byte array: ");
printByteArrayPreview(encodedData);
// 🔹 الخطوة 3: فك التشفير من مصفوفة البايتات
System.out.println(" Decoding from byte array...");
Book decodedBook = Book.parseFrom(encodedData);
System.out.println(" Decoded Book:");
printBookDetails(decodedBook, " ");
// 🔹 الخطوة 4: التحقق من التكافؤ
System.out.println(" Verification:");
System.out.println(" Titles match: " + originalBook.getTitle().equals(decodedBook.getTitle()));
System.out.println(" Authors match: " + originalBook.getAuthor().getName().equals(decodedBook.getAuthor().getName()));
System.out.println(" Years match: " + (originalBook.getYear() == decodedBook.getYear()));
System.out.println(" Full objects equal: " + originalBook.equals(decodedBook));
} catch (InvalidProtocolBufferException e) {
System.err.println(" Error in encoding/decoding: " + e.getMessage());
} }
System.out.println(); }
System.out.println("Total bytes: " + msg.length);
// Deserialize private static void encodeDecodeLibrary() {
var library = Library.parseFrom(msg); System.out.println("2. Library (Book Collection) Encoding & Decoding:");
System.out.println("Library contents:");
System.out.println(library.getBooksList());
// Display detailed book information try {
System.out.println("\nDetailed Book Information:"); // 🔹 الخطوة 1: إنشاء مكتبة متعددة الكتب
for (Book book : library.getBooksList()) { Book book1 = Book.newBuilder()
System.out.println("Title: " + book.getTitle()); .setTitle("Clean Code: A Handbook of Agile Software Craftsmanship")
System.out.println("Author: " + book.getAuthor().getName() + " from " + book.getAuthor().getCountry()); .setAuthor(Author.newBuilder()
System.out.println("ISBN: " + book.getIsbn()); .setName("Robert C. Martin")
System.out.println("Year: " + book.getYear()); .setCountry("USA")
System.out.println("Type: " + book.getType()); .build())
System.out.println("Categories: " + book.getCategoriesList()); .setIsbn("978-0132350884")
System.out.println("Available: " + book.getAvailable()); .setYear(2008)
System.out.println("---"); .setType(BookType.TECHNICAL)
.addCategories("Software Engineering")
.addCategories("Programming")
.setAvailable(true)
.build();
Book book2 = Book.newBuilder()
.setTitle("The Pragmatic Programmer: Your Journey to Mastery")
.setAuthor(Author.newBuilder()
.setName("Andrew Hunt")
.setCountry("USA")
.build())
.setIsbn("978-0135957059")
.setYear(2019)
.setType(BookType.TECHNICAL)
.addCategories("Programming")
.addCategories("Career Development")
.setAvailable(true)
.build();
Book book3 = Book.newBuilder()
.setTitle("Domain-Driven Design: Tackling Complexity in the Heart of Software")
.setAuthor(Author.newBuilder()
.setName("Eric Evans")
.setCountry("USA")
.build())
.setIsbn("978-0321125217")
.setYear(2003)
.setType(BookType.TECHNICAL)
.addCategories("Software Design")
.addCategories("Architecture")
.setAvailable(false)
.build();
Library originalLibrary = Library.newBuilder()
.addBooks(book1)
.addBooks(book2)
.addBooks(book3)
.build();
System.out.println(" Original Library Created:");
System.out.println(" Total books: " + originalLibrary.getBooksCount());
for (int i = 0; i < originalLibrary.getBooksCount(); i++) {
System.out.println(" " + (i + 1) + ". " + originalLibrary.getBooks(i).getTitle());
}
// 🔹 الخطوة 2: الترميز
byte[] encodedLibrary = originalLibrary.toByteArray();
System.out.println(" Encoding library to byte array...");
System.out.println(" Encoded size: " + encodedLibrary.length + " bytes");
System.out.print(" Byte array preview: ");
printByteArrayPreview(encodedLibrary);
// 🔹 الخطوة 3: فك التشفير
System.out.println(" Decoding library from byte array...");
Library decodedLibrary = Library.parseFrom(encodedLibrary);
System.out.println(" Decoded Library:");
System.out.println(" Total books: " + decodedLibrary.getBooksCount());
for (int i = 0; i < decodedLibrary.getBooksCount(); i++) {
Book book = decodedLibrary.getBooks(i);
System.out.println(" " + (i + 1) + ". " + book.getTitle() +
" by " + book.getAuthor().getName() +
" (" + book.getYear() + ")");
}
// 🔹 الخطوة 4: مقارنة الكفاءة مع JSON نظرياً
String jsonEquivalent = createJsonEquivalent(originalLibrary);
System.out.println(" Efficiency Comparison:");
System.out.println(" Protobuf size: " + encodedLibrary.length + " bytes");
System.out.println(" Estimated JSON size: " + jsonEquivalent.getBytes().length + " bytes");
int saving = ((jsonEquivalent.getBytes().length - encodedLibrary.length) * 100) / jsonEquivalent.getBytes().length;
System.out.println(" Size reduction: " + saving + "%");
} catch (InvalidProtocolBufferException e) {
System.err.println(" Error in library encoding/decoding: " + e.getMessage());
} }
} }
private static byte[] sender() { private static void encodeDecodeServiceMessages() {
// Create first book System.out.println("3. Service Messages Encoding & Decoding:");
Book book1 = Book.newBuilder()
.setTitle("Protocol Buffers in Distributed Systems") try {
.setAuthor(Author.newBuilder() // 🔹 ترميز وفك تشفير طلب إضافة كتاب
.setName("Ahmed Networks") Book newBook = Book.newBuilder()
.setCountry("Egypt") .setTitle("gRPC: Up and Running")
.build()) .setAuthor(Author.newBuilder()
.setIsbn("978-1234567890") .setName("Kasun Indrasiri")
.setYear(2024) .setCountry("Sri Lanka")
.setType(BookType.TECHNICAL) .build())
.addCategories("Networks") .setIsbn("978-1492058330")
.addCategories("Programming") .setYear(2020)
.setAvailable(true) .setType(BookType.TECHNICAL)
.build(); .addCategories("gRPC")
.addCategories("Microservices")
// Create second book .setAvailable(true)
Book book2 = Book.newBuilder() .build();
.setTitle("gRPC Fundamentals and Communications")
.setAuthor(Author.newBuilder() AddBookRequest addRequest = AddBookRequest.newBuilder()
.setName("Mohamed Developer") .setBook(newBook)
.setCountry("Saudi Arabia") .build();
.build())
.setIsbn("978-0987654321") System.out.println(" AddBookRequest Encoding:");
.setYear(2023) System.out.println(" Book: " + addRequest.getBook().getTitle());
.setType(BookType.SCIENCE)
.addCategories("Communications") byte[] encodedRequest = addRequest.toByteArray();
.addCategories("API") System.out.println(" Encoded size: " + encodedRequest.length + " bytes");
.setAvailable(true)
.build(); AddBookRequest decodedRequest = AddBookRequest.parseFrom(encodedRequest);
System.out.println(" Decoded book: " + decodedRequest.getBook().getTitle());
// Create library and add books
Library library = Library.newBuilder() // 🔹 ترميز وفك تشفير استجابة إضافة كتاب
.addBooks(book1) AddBookResponse addResponse = AddBookResponse.newBuilder()
.addBooks(book2) .setSuccess(true)
.build(); .setMessage("Book added successfully to library database")
.setBookId("LIB-2024-001")
// Serialize to byte array .build();
byte[] arrayToSend = library.toByteArray();
System.out.println(" AddBookResponse Encoding:");
// Display sent data System.out.println(" Success: " + addResponse.getSuccess());
System.out.println(" Sent Data:"); System.out.println(" Message: " + addResponse.getMessage());
for (int i = 0; i < arrayToSend.length; i++) {
System.out.print(arrayToSend[i] + " "); byte[] encodedResponse = addResponse.toByteArray();
System.out.println(" Encoded size: " + encodedResponse.length + " bytes");
AddBookResponse decodedResponse = AddBookResponse.parseFrom(encodedResponse);
System.out.println(" Decoded success: " + decodedResponse.getSuccess());
System.out.println(" Decoded book ID: " + decodedResponse.getBookId());
// 🔹 ترميز وفك تشفير طلب البحث
GetBookRequest searchRequest = GetBookRequest.newBuilder()
.setIsbn("978-1492058330")
.build();
System.out.println(" GetBookRequest Encoding:");
System.out.println(" ISBN: " + searchRequest.getIsbn());
byte[] encodedSearch = searchRequest.toByteArray();
System.out.println(" Encoded size: " + encodedSearch.length + " bytes");
System.out.print(" Byte array: ");
printByteArrayPreview(encodedSearch);
GetBookRequest decodedSearch = GetBookRequest.parseFrom(encodedSearch);
System.out.println(" Decoded ISBN: " + decodedSearch.getIsbn());
} catch (InvalidProtocolBufferException e) {
System.err.println(" Error in service messages encoding/decoding: " + e.getMessage());
}
}
// ========== Methods ==========
private static void printBookDetails(Book book, String indent) {
System.out.println(indent + "Title: " + book.getTitle());
System.out.println(indent + "Author: " + book.getAuthor().getName() + " (" + book.getAuthor().getCountry() + ")");
System.out.println(indent + "ISBN: " + book.getIsbn());
System.out.println(indent + "Year: " + book.getYear());
System.out.println(indent + "Type: " + book.getType());
System.out.println(indent + "Categories: " + book.getCategoriesList());
System.out.println(indent + "Available: " + book.getAvailable());
}
private static void printByteArrayPreview(byte[] data) {
int previewLength = Math.min(data.length, 15);
for (int i = 0; i < previewLength; i++) {
System.out.print(data[i] + " ");
}
if (data.length > previewLength) {
System.out.print("... (+" + (data.length - previewLength) + " more bytes)");
} }
System.out.println(); System.out.println();
System.out.println(" Total bytes to send: " + arrayToSend.length); }
return arrayToSend; private static String createJsonEquivalent(Library library) {
// محاكاة تقريبية لحجم JSON
StringBuilder json = new StringBuilder("[");
for (Book book : library.getBooksList()) {
if (json.length() > 1) json.append(",");
json.append("{")
.append("\"title\":\"").append(book.getTitle()).append("\",")
.append("\"author\":{")
.append("\"name\":\"").append(book.getAuthor().getName()).append("\",")
.append("\"country\":\"").append(book.getAuthor().getCountry()).append("\"")
.append("},")
.append("\"isbn\":\"").append(book.getIsbn()).append("\",")
.append("\"year\":").append(book.getYear()).append(",")
.append("\"type\":\"").append(book.getType()).append("\",")
.append("\"categories\":").append(book.getCategoriesList().toString()).append(",")
.append("\"available\":").append(book.getAvailable())
.append("}");
}
json.append("]");
return json.toString();
} }
} }
\ No newline at end of file
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment