2010-10-20 7 views
6

क्रमानुसार करने मैं कैसे RMI का उपयोग करके नेटवर्क करवाते हैं एक java.nio.ByteBuffer भेजना चाहते हैं, फिर भी ByteBuffer serializable नहीं है। मैं कोई लाभ नहीं हुआ निम्न कस्टम वर्ग की कोशिश की है:ByteBuffer

public class NetByteBuffer implements java.io.Serializable { 

ByteBuffer buffer; 

public NetByteBuffer(ByteBuffer buffer) { 
    this.buffer = buffer; 
} 

public ByteBuffer getByteBuffer() { 
    return this.buffer; 
} 

}

ग्राहक अभी भी एक गैर serialzable अपवाद हो जाता है। कोई विचार?

धन्यवाद

उत्तर

6

आप नहीं कर सकते। आप byte[] को बेहतर तरीके से प्राप्त करेंगे और इसे दूसरी तरफ ByteBuffer का पुनर्निर्माण करेंगे। आप बफर होने के फायदे खो रहे हैं।

+0

मैं क्या फायदे खो जाएगा? यह आपको एक विशेष कारण के बिना 'ByteBuffer' उपयोग कर रहे हैं, तो शायद आप बाइट सरणी का उपयोग कर सुरक्षित हैं Filechannel.map – jtnire

+2

से एक PDF फ़ाइल के लिए है;) – Bozho

1

आप शायद यही कारण है कि आप एक बाइट बफर serializing रहे हैं के बारे में अधिक कहने के लिए की जरूरत है। यदि आप बस नेटवर्क पर बाइट्स का एक गुच्छा भेजने की कोशिश कर रहे हैं, तो @ बोझो के जवाब ने आपको कवर किया है।

यदि आप वास्तव में ByteBuffer पर अपनी सामग्री और राज्य सहित भेजना चाहते हैं, तो आपको शायद अपने डिज़ाइन पर पुनर्विचार करना होगा, या कम से कम इसे यहां समझाएं ताकि अन्य लोग अधिक दिशा प्रदान कर सकें।

0

लांग तरीका है, लेकिन अपने लक्ष्य को पूरा किया जा सकता है:

यू "ByteBuffer" का उदाहरण चर प्रकार के साथ एक दूरस्थ वस्तु बना सकते हैं और गेटर और सेटर दूरदराज के तरीकों कि चर का उपयोग करने की परिभाषित किया।

3

अन्य लोगों की तरह कहा गया है कि बाइटबफर बाइट्स के बफर का एक लपेट है, इसलिए यदि आपको अपनी कक्षा को क्रमबद्ध करने की आवश्यकता है तो बाइट [] में बदलना बेहतर है और इस बीन में डेटा पढ़ने/लिखने वाले वर्गों में बाइटबफर का उपयोग करें।

लेकिन यदि आपको बाइटबफर संपत्ति (उदाहरण के लिए यूज़िन कैसंड्रा ब्लब्स) को क्रमबद्ध करने की आवश्यकता है तो आप हमेशा एक कस्टम सीरियलाइजेशन लागू कर सकते हैं (इस यूआरएल http://www.oracle.com/technetwork/articles/java/javaserial-1536170.html देखें)।

मुख्य बिंदु इस प्रकार हैं:

  1. निशान क्षणिक रूप ByteBuffer (इसलिए यह डिफ़ॉल्ट रूप से धारावाहिक नहीं है)
  2. अपने स्वयं के पढ़ने को लागू/क्रमबद्धता के लिए लिखना जहां ByteBuffer -> बाइट [] जब serializing और बाइट [] -> desteializing पर बाइटबफर।

इस वर्ग की कोशिश करो और मुझे पता है अगर यह आपके लिए काम करता है:

public class NetByteBuffer implements java.io.Serializable { 
    private static final long serialVersionUID = -2831273345165209113L; 

    //serializable property 
    String anotherProperty; 

    // mark as transient so this is not serialized by default 
    transient ByteBuffer data; 

    public NetByteBuffer(String anotherProperty, ByteBuffer data) { 
     this.data = data; 
     this.anotherProperty = anotherProperty; 
    } 

    public ByteBuffer getData() { 
     return this.data; 
    } 

    private void writeObject(ObjectOutputStream out) throws IOException { 
     // write default properties 
     out.defaultWriteObject(); 
     // write buffer capacity and data 
     out.writeInt(data.capacity()); 
     out.write(data.array()); 

    } 

    private void readObject(ObjectInputStream in) throws IOException, ClassNotFoundException { 
     //read default properties 
     in.defaultReadObject(); 

     //read buffer data and wrap with ByteBuffer 
     int bufferSize = in.readInt(); 
     byte[] buffer = new byte[bufferSize]; 
     in.read(buffer, 0, bufferSize); 
     this.data = ByteBuffer.wrap(buffer, 0, bufferSize); 
    } 

    public String getAnotherProperty() { 
     return anotherProperty; 
    } 

} 
संबंधित मुद्दे