मेरे सामान्य और पसंदीदा समाधान के माध्यम से enums serializing है उनके सामान्य मूल्य।
public class EnumWritable implements Writable {
static enum EnumName {
ENUM_1, ENUM_2, ENUM_3
}
private int enumOrdinal;
// never forget your default constructor in Hadoop Writables
public EnumWritable() {
}
public EnumWritable(Enum<?> arbitraryEnum) {
this.enumOrdinal = arbitraryEnum.ordinal();
}
public int getEnumOrdinal() {
return enumOrdinal;
}
@Override
public void readFields(DataInput in) throws IOException {
enumOrdinal = in.readInt();
}
@Override
public void write(DataOutput out) throws IOException {
out.writeInt(enumOrdinal);
}
public static void main(String[] args) {
// use it like this:
EnumWritable enumWritable = new EnumWritable(EnumName.ENUM_1);
// let Hadoop do the write and read stuff
EnumName yourDeserializedEnum = EnumName.values()[enumWritable.getEnumOrdinal()];
}
}
जाहिर है यह कमियां भी हैं: इसलिए यदि आप ENUM_3
साथ ENUM_2
का आदान-प्रदान ऑर्डिनल्स, बदल सकते हैं और एक पहले से धारावाहिक फ़ाइल पढ़ सकते हैं, यह अन्य गलत enum वापस आ जाएगी।
तो अगर आप enum वर्ग पहले से पता है, तुम अपने enum के नाम लिख सकते हैं और इस तरह से इसका इस्तेमाल कर सकते हैं:
enumInstance = EnumName.valueOf(in.readUTF());
यह थोड़ा और अधिक स्थान का उपयोग करेगा, लेकिन यह करने के लिए परिवर्तन करने के लिए सेव अधिक है आपके enum नाम।
पूर्ण उदाहरण इस प्रकार दिखाई देगा:
public class EnumWritable implements Writable {
static enum EnumName {
ENUM_1, ENUM_2, ENUM_3
}
private EnumName enumInstance;
// never forget your default constructor in Hadoop Writables
public EnumWritable() {
}
public EnumWritable(EnumName e) {
this.enumInstance = e;
}
public EnumName getEnum() {
return enumInstance;
}
@Override
public void write(DataOutput out) throws IOException {
out.writeUTF(enumInstance.name());
}
@Override
public void readFields(DataInput in) throws IOException {
enumInstance = EnumName.valueOf(in.readUTF());
}
public static void main(String[] args) {
// use it like this:
EnumWritable enumWritable = new EnumWritable(EnumName.ENUM_1);
// let Hadoop do the write and read stuff
EnumName yourDeserializedEnum = enumWritable.getEnum();
}
}
स्रोत
2012-10-09 13:36:44
जबकि स्थैतिक विधि मनमाने ढंग से फ़ाइलों को कस्टम लिखने के लिए एक अच्छा समाधान है, तो आपको इंटरफेस विधि भरनी होगी, क्योंकि उन्हें आंतरिक रूप से कहा जाता है। जावा एपीआई में बाहरी उपयोग योग्य लेखन योग्य कार्य। –