Java 如何在Hadoop中序列化列表集合对象?

Java 如何在Hadoop中序列化列表集合对象?,java,serialization,hadoop,Java,Serialization,Hadoop,有没有办法在Hadoop中序列化java集合 可写接口仅适用于Java原语。我有以下类属性 private String keywords; private List<Status> tweets; private long queryTime = 0; public TweetStatus(String keys, List<Status> tweets, long queryTime){ this.keywords = keys; this.twee

有没有办法在Hadoop中序列化java集合

可写
接口仅适用于Java原语。我有以下类属性

private String keywords;
private List<Status> tweets;
private long queryTime = 0;

public TweetStatus(String keys, List<Status> tweets, long queryTime){
    this.keywords = keys;
    this.tweets = tweets;
    this.queryTime = queryTime;
}
私有字符串关键字;
私人列表推文;
私有长查询时间=0;
公共tweets状态(字符串键、列表tweets、长查询时间){
这个.关键字=键;
this.tweets=tweets;
this.queryTime=queryTime;
}

如何序列化
列表
对象

看看ArrayWritable。它允许您序列化实例数组(所有实例都是相同类型的)。您可以从列表中构建其中一个

如果前面有很多序列化内容,您可能会发现它们很有用

可写
接口仅适用于Java原语

对。基本上,您需要将对象分解为一系列可以序列化的对象

因此,从第一原则来看,要序列化列表,需要序列化列表的大小,然后序列化列表的每个元素。这样,当您需要反序列化时,您就知道需要反序列化多少元素

像这样的东西应该会让你进入写作(双关语)的轨道:

类TweetStatusWritable实现可写{
私有字符串关键字;
私人列表推文;
私人长查询时间;
//为上述三个字段添加getter
公共无效读取字段(数据输入到){
this.keywords=in.readUTF();
int size=in.readInt();
this.tweets=新列表();
对于(int i=0;i
为什么不能将
状态
分解成一组原语,将其转换成可写的
状态
?状态的定义是什么?MapWritable甚至比ArrayWritable更好在本例中,注释“//序列化tweets[i]到out”是什么意思。此处,列表tweets的数据类型为自定义数据类型“Status”。如果它是一种原始数据类型,比如“Long”,那么将tweets序列化到out上时,写入“out.writeLong(tweets[i]);”是否正确?
class TweetStatusWritable implements Writable {
    private String keywords;
    private List<Status> tweets;
    private long queryTime;

    // add getters for the above three fields

    public void readFields(DataInput in) {
        this.keywords = in.readUTF();
        int size = in.readInt();
        this.tweets = new List<Status>();
        for(int i = 0; i < size; i++) {
            Status status = // deserialize an instance of Status
            tweets.add(status);
        }
        this.queryTime = in.readLong();
    }

    public void write(DataOutput out) {
        out.writeUTF(this.keywords);
        out.writeInt(this.tweets.size());
        for(int i = 0; i < this.tweets.size(); i++) {
             // serialize tweets[i] onto out
        }       
        out.writeLong(queryTime);
    }

    public TweetStatusWritable(
        String keywords,
        List<Status> tweets,
        long queryTime
    ) {
        this.keywords = keywords;
        this.tweets = tweets;
        this.queryTime = queryTime;
    }
}