سؤال

يرسل محول الشبكة log4j الأحداث ككائن Java متسلسل.أود أن أكون قادرًا على التقاط هذا الكائن وإلغاء تسلسله بلغة مختلفة (بيثون).هل هذا ممكن؟

ملحوظة التقاط الشبكة أمر سهل.إنه مجرد مقبس TCP والقراءة في الدفق.الصعوبة هي جزء إلغاء التسلسل

هل كانت مفيدة؟

المحلول

عموما لا.

يتم تعريف تنسيق الدفق لتسلسل Java في هذه الوثيقة, ، لكنك تحتاج إلى الوصول إلى تعريفات الفئة الأصلية (ووقت تشغيل Java لتحميلها فيه) لتحويل بيانات الدفق مرة أخرى إلى شيء يقترب من الكائنات الأصلية.على سبيل المثال، قد تحدد الفئات أساليب writeObject() وreadObject() لتخصيص النموذج المتسلسل الخاص بها.

(يحرر: يقترح لوبوس هاسكو وجود برنامج جافا صغير لإلغاء تسلسل الكائنات أمام بايثون، ولكن المشكلة هي أنه لكي ينجح هذا، يحتاج "برنامج جافا الصغير" الخاص بك إلى تحميل نفس الإصدارات من جميع الفئات نفسها التي قد يقوم بإلغاء تسلسلها.يعد هذا أمرًا صعبًا إذا كنت تتلقى رسائل سجل من تطبيق واحد، ويكون صعبًا حقًا إذا كنت تقوم بتعدد إرسال أكثر من تدفق سجل واحد.وفي كلتا الحالتين، لن يكون برنامجًا صغيرًا بعد الآن. تحرير 2: قد أكون مخطئًا هنا، لا أعرف ما الذي يتم تسلسله.إذا كانت مجرد فئات log4j فيجب أن تكون على ما يرام.من ناحية أخرى، من الممكن تسجيل الاستثناءات التعسفية، وإذا تم وضعها في الدفق فستكون وجهة نظري أيضًا.)

سيكون من الأسهل تخصيص محول الشبكة log4j واستبدال التسلسل الأولي ببعض النماذج التي يمكن إلغاء تسلسلها بسهولة (على سبيل المثال، يمكنك استخدام XStream لتحويل الكائن إلى تمثيل XML)

نصائح أخرى

نظريا, ، انه ممكن.تم توحيد تسلسل Java، مثل كل شيء تقريبًا في Javaland.وانت ايضا استطاع تنفيذ أداة إلغاء التسلسل وفقًا لهذا المعيار في Python.ومع ذلك، فإن تنسيق Java Serialization غير مصمم للاستخدام عبر اللغات، ويرتبط تنسيق التسلسل بشكل وثيق بالطريقة التي يتم بها تمثيل الكائنات داخل JVM.على الرغم من أن تنفيذ JVM في Python يعد بالتأكيد تمرينًا ممتعًا، إلا أنه ربما ليس ما تبحث عنه (-:

هناك تنسيقات أخرى لتسلسل (البيانات) مصممة خصيصًا لتكون حيادية للغة.تعمل عادةً عن طريق تجريد تنسيقات البيانات إلى الحد الأدنى (الرقم والسلسلة والتسلسل والقاموس وهذا كل شيء) وبالتالي تتطلب القليل من العمل على كلا الطرفين لتمثيل كائن غني كرسم بياني لهياكل البيانات الغبية (والعكس بالعكس).

هناك مثالان JSON (ترميز كائن JavaScript) و YAML (YAML ليست لغة ترميزية).

ASN.1 (ترميز بناء الجملة الملخص الأول) هو تنسيق آخر لتسلسل البيانات.بدلاً من تقليل التنسيق إلى نقطة يمكن فهمها بسهولة، فإن ASN.1 يصف نفسه بنفسه، مما يعني أن جميع المعلومات اللازمة لفك تشفير التدفق يتم تشفيرها داخل التدفق نفسه.

وبالطبع، XML (لغة الترميز الموسعة), ، سيعمل أيضًا، بشرط ألا يتم استخدامه فقط لتوفير تمثيل نصي لـ "تفريغ الذاكرة" لكائن Java، ولكن أيضًا مجردة فعلية، وترميز حيادي للغة.

لذا، لكي أختصر القصة الطويلة:أفضل رهان لك هو إما محاولة إجبار log4j على تسجيل الدخول بأحد التنسيقات المذكورة أعلاه، أو استبدال log4j بشيء يفعل ذلك أو محاولة اعتراض الكائنات بطريقة ما قبل إرسالها عبر السلك وتحويلها قبل مغادرة Javaland.

المكتبات التي تستخدم JSON وYAML وASN.1 وXML متاحة لكل من Java وPython (وتقريبًا كل لغة برمجة معروفة للإنسان).

أوصي بالانتقال إلى تنسيق جهة خارجية (عن طريق إنشاء محولات log4j الخاصة بك وما إلى ذلك) التي تفهمها كلتا اللغتين ويمكن تنظيمها/إلغاء تنظيمها بسهولة، على سبيل المثال.XML.

من الناحية النظرية فمن الممكن.الآن مدى صعوبة الأمر من الناحية العملية يعتمد على ما إذا كان تنسيق Java التسلسلي موثقًا أم لا.أعتقد أن الأمر ليس كذلك. يحرر: عفوًا، لقد كنت مخطئًا، شكرًا تشارلز.

على أية حال، هذا ما أقترح عليك أن تفعله

  1. الالتقاط من log4j وإلغاء تسلسل كائن Java في برنامج Java الصغير الخاص بك.

  2. الآن عندما يكون لديك الكائن مرة أخرى، قم بإجراء تسلسل له باستخدام المنسق المخصص الخاص بك.

    نصيحة: ربما لا يتعين عليك حتى كتابة المنسق المخصص الخاص بك.على سبيل المثال، JSON (قم بالتمرير لأسفل للوصول إلى libs) يحتوي على مكتبات لـ Python وJava، لذا يمكنك نظريًا استخدام مكتبة Java لإجراء تسلسل للكائنات الخاصة بك ومكتبة Python المكافئة لإلغاء تسلسلها

  3. أرسل دفق الإخراج إلى تطبيق python الخاص بك وقم بإلغاء تسلسله

كتب تشارلز:

المشكلة هي أنه لكي يعمل هذا ، يحتاج "برنامج Java الصغير" إلى تحميل نفس الإصدارات من جميع الفئات نفسها التي قد تهدأ.هذا أمر صعب إذا كنت تتلقى رسائل سجل من تطبيق واحد ، وصعب حقًا إذا كنت تعدد الإرسال أكثر من دفق سجل واحد.في كلتا الحالتين ، لن يكون برنامجًا صغيرًا بعد الآن.

ألا يمكنك ببساطة الرجوع إلى مكتبات Java log4j في عملية جافا الخاصة بك؟أنا فقط أقدم نصيحة عامة هنا تنطبق على أي زوج من اللغات (اسم السؤال هو ملحد جدًا للغة لذا فقد قدمت للتو أحد الحلول العامة).على أي حال، لست على دراية بـ log4j ولا أعرف ما إذا كان بإمكانك "حقن" المُسلسل الخاص بك فيه.إذا استطعت، فبالطبع اقتراحك أفضل وأنظف بكثير.

حسنًا، أنا لست خبيرًا في Python لذا لا يمكنني التعليق على كيفية حل مشكلتك، ولكن إذا كان لديك برنامج في .NET، فيمكنك استخدام IKVM.NET لإلغاء تسلسل كائنات Java بسهولة.لقد قمت بتجربة ذلك عن طريق إنشاء .NET Client لرسائل سجل Log4J المكتوبة إلى مُلحق المقبس وعملت بشكل جيد حقًا.

أنا آسف، إذا كانت هذه الإجابة غير منطقية هنا.

إذا كان بإمكانك الحصول على JVM على الجانب المتلقي وتعريفات الفئة للبيانات المتسلسلة، وتريد فقط استخدام Python وليس لغة أخرى، فيمكنك استخدام Jython:

  • يمكنك إلغاء تسلسل ما تلقيته باستخدام طرق Java الصحيحة
  • ثم تقوم بمعالجة ما تحصل عليه باستخدام كود بايثون الخاص بك
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top