سؤال

هل من الممكن ObjectOutputStream/ObjectInputStream فئة داخلية؟يمكنني كتابته جيدًا وفحص الملف الذي تم إنشاؤه، ولكن عندما أحاول قراءته مرة أخرى باستخدام ObjectInputStream، أحصل على EOFException فقط أحاول قراءة Object o = oos.readObject();

  1. أستخدم نفس كائن الملف لفتح كلا الدفقين، لذا فهذه ليست المشكلة.
  2. يبدو أنه مستقل عن طبيعة الفصل الداخلي - فالفصل الذي يحتوي على عدد صحيح عام فقط يفشل بشكل مماثل لفئة أكثر تعقيدًا.

لا بد لي من المضي قدمًا وإنشاء فصل دراسي عادي وإنشاء مثيل في فصل المرسل، لكنني أكره الابتعاد دون معرفة ما إذا كان ذلك ممكنًا، وإذا لم يكن كذلك فلماذا لا.

تحديث:المشكلات ذات الصلة التي كانت سبب المشكلة:

أ.لا يمكنك إعادة فتح ملف مكتوب باستخدام ObjectOutputStream وإلحاقه:تتم كتابة رأس ثانٍ ويفسد الملف.

ب.لا يعمل تسلسل HashMap باستخدام ByteOutputStream لإجراء ملخص التجزئة، لأنه عندما تقرأ HashMap مرة أخرى من ملف ObjectOutputStream، قد تحصل على بايت مختلف [] من ByteOutputStream بسبب الاختلافات في ترتيب الزوج:المحتوى هو نفسه، ولكن البايت [] (وبالتالي يتم تفكيك التجزئة) ليس كذلك.

نأمل أن يساعد هذا شخص ما على توفير بعض الوقت.

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

المحلول

هذا واحد يعمل بالنسبة لي.يرجى البحث عن أي اختلافات في الحل الخاص بك.

public class Example implements Serializable {
    public static void main(String[] args) throws IOException, ClassNotFoundException {
        new Example().run();
    }

    private void run() throws IOException, ClassNotFoundException {
        Inner inner = new Inner();
        inner.x = 5;
        ByteArrayOutputStream out = new ByteArrayOutputStream();
        ObjectOutputStream outputStream = new ObjectOutputStream( out );
        outputStream.writeObject( inner );

        ByteArrayInputStream in = new ByteArrayInputStream( out.toByteArray() );
        ObjectInputStream inputStream = new ObjectInputStream( in );
        Inner inner2 = (Inner) inputStream.readObject();

        System.out.println( inner2.x );
    }

    class Inner implements Serializable {
        int x;
    }
}

نصائح أخرى

هل يمكنك تضمين جزء صغير من نموذج التعليمات البرمجية؟التفسير الأكثر وضوحًا هو أنك لا تقوم بإغلاق/مسح دفق الإخراج قبل محاولة قراءته مرة أخرى.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top