سؤال

لدي الكود التالي الذي يوضح إما وجود خطأ أو سوء فهم من جهتي.

لقد أرسلت نفس القائمة، ولكن تم تعديلها عبر ObjectOutputStream.مرة واحدة كـ [0] وأخرى كـ [1].ولكن عندما قرأته، أحصل على [0] مرتين.أعتقد أن السبب في ذلك هو أنني أرسل نفس الكائن ويجب أن يقوم ObjectOutputStream بتخزينه مؤقتًا بطريقة ما.

هل هذا العمل كما ينبغي، أم يجب علي الإبلاغ عن خطأ؟

import java.io.*;
import java.net.*;
import java.util.*;

public class OOS {

    public static void main(String[] args) throws Exception {
        Thread t1 = new Thread(new Runnable() {
            public void run() {
                try {
                    ServerSocket ss = new ServerSocket(12344);
                    Socket s= ss.accept();

                    ObjectOutputStream oos = new ObjectOutputStream(s.getOutputStream());
                    List same = new ArrayList();
                    same.add(0);
                    oos.writeObject(same);
                    same.clear();
                    same.add(1);
                    oos.writeObject(same);

                } catch(Exception e) {
                    e.printStackTrace();
                }
            }
        });
        t1.start();

        Socket s = new Socket("localhost", 12344);
        ObjectInputStream ois = new ObjectInputStream(s.getInputStream());

        // outputs [0] as expected
        System.out.println(ois.readObject());

        // outputs [0], but expected [1]
        System.out.println(ois.readObject());
        System.exit(0);
    }
}
هل كانت مفيدة؟

المحلول

يحتوي الدفق على رسم بياني مرجعي، لذا فإن الكائن الذي يتم إرساله مرتين لن يعطي كائنين على الطرف الآخر، بل ستحصل على كائن واحد فقط.وإرسال نفس الكائن مرتين بشكل منفصل سيعطيك نفس المثيل مرتين (كل منهما بنفس البيانات - وهو ما تراه).

راجع طريقة إعادة التعيين () إذا كنت تريد إعادة تعيين الرسم البياني.

نصائح أخرى

الحد الأقصى صحيح، ولكن يمكنك أيضًا استخدام:

public void writeUnshared(Object obj);

انظر التعليق أدناه للحصول على التحذير

ما تريده على الأرجح هو:

ObjectOutputStream oos = new ObjectOutputStream(s.getOutputStream());
List same = new ArrayList();
same.add(0);
oos.writeObject(same);
oos.flush();  // flush the stream here
same.clear();
same.add(1);
oos.writeObject(same);

وإلا فسيتم مسح نفس الكائن مرتين عند إغلاق الدفق أو نفاد المخزن المؤقت الخاص به.

فقط لمعلوماتك، عندما تقوم بإلغاء تسلسل الكائنات إلى، على سبيل المثال o1 و o2, o1 != o2.

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