You're right, Serializable should be sufficient. I was thinking of a
case where you'd sometimes want to write them out as values, but other
times combine them inside Sample.

On 10/10/07, Steve Schlosser <[EMAIL PROTECTED]> wrote:
> Is this true?  The fact that SampleValue and Address implement
> Serializable should be sufficient to write them out to the stream.
> They are not ever written out as keys or values themselves.
>
> -steve
>
> On 10/10/07, Matt Kent <[EMAIL PROTECTED]> wrote:
> > I believe in this case you'll want to make Sample and Address writable as 
> > well.
> >
> > On 10/10/07, Steve Schlosser <[EMAIL PROTECTED]> wrote:
> > > Hello all
> > >
> > > Is there a best practice for using my own classes as keys and values?
> > >
> > > My first attempt at doing this was successful - I built a
> > > BigIntegerWritable class using IntWritable as a template.  It was easy
> > > because BigInteger has methods converting to and from byte arrays,
> > > which I could then write into the DataOutput or read from the
> > > DataInput.
> > >
> > > It seems like I should be able to use object serialization to write
> > > to/read from the DataOutput/Input objects and make my own classes
> > > implement the Writable interface.  It seems like I should be able to
> > > do something like this:
> > >
> > > import java.io.*;
> > >
> > > import org.apache.hadoop.io.*;
> > >
> > > public class Sample implements Writable {
> > >
> > >     Address address;
> > >     SampleValue value;         // sampled value at this point
> > >
> > >     public Sample(Address a, SampleValue v) {
> > >         address = a;
> > >         value = v;
> > >     }
> > >
> > >     public SampleValue getValue()  { return value;}
> > >     public Address getAddress() { return address; }
> > >
> > >     public String toString () {
> > >         return (address.toString() + " " + value.toString());
> > >     }
> > >
> > > [...]
> > >
> > >     public void readFields(DataInput in) throws IOException {
> > >         ObjectInputStream oin = new 
> > > ObjectInputStream((DataInputBuffer)in);
> > >
> > >         try {
> > >             address = (Address)oin.readObject();
> > >             value = (SampleValue)oin.readObject();
> > >         } catch (ClassNotFoundException e) {
> > >             throw new IOException(e.toString());
> > >         }
> > >
> > >     }
> > >
> > >     public void write(DataOutput out) throws IOException {
> > >         ObjectOutputStream oout = new 
> > > ObjectOutputStream((DataOutputBuffer)out);
> > >
> > >         oout.writeObject(address);
> > >         oout.writeObject(value);
> > >     }
> > > }
> > >
> > > This code compiles, but throws exceptions at runtime, complaining that
> > > WritableComparator can not access a member of class Sample with
> > > modifiers "".  Can someone tell me what this exception is talking
> > > about?
> > >
> > > Do I need to implement a WritableComparator for each class that I want
> > > to implement Writable?
> > >
> > > Thanks again for the help.
> > >
> > > -steve
> > >
> >
>

Reply via email to