知识点
相关文章
更多最近更新
更多自定义Hadoop的可序列化类
2019-03-28 13:42|来源: 网络
Java原生语言中要想一个自定义类可序列化,很简单,只要让这个类实现java.io.Serializable接口就可以了,但是在Hadoop框架中,要想让自定义类可以被序列化,我们必须手动让其实现WritableCompable接口并且实现write(),readFields(),compareTo()方法。
下面就是一个我们自定义的可序列化的类:
- /*
- */
- package com.charles.writable;
- import java.io.DataInput;
- import java.io.DataOutput;
- import java.io.IOException;
- import org.apache.hadoop.io.IntWritable;
- import org.apache.hadoop.io.Text;
- import org.apache.hadoop.io.WritableComparable;
- /**
- *
- * Description: 这是自定义的Hadoop序列化类,它可以用Hadoop序列化反序列化这个类
- *
- * @author charles.wang
- * @created Jun 2, 2012 11:19:25 AM
- *
- */
- public class PersonWritable implements WritableComparable<PersonWritable> {
- private Text name;
- private IntWritable age;
- private Text title;
- public PersonWritable(){
- set("someperson",0,"sometitle");
- }
- public PersonWritable(String name ,int age, String title){
- set(name,age,title);
- }
- public void set(String name ,int age,String title){
- this.name = new Text(name);
- age=(age>0)?age:1;
- this.age = new IntWritable(age);
- this.title= new Text(title);
- }
- /**
- * 这个方法用于定义序列化过程,它把这个对象的所有字段依次序列化
- */
- @Override
- public void write(DataOutput out) throws IOException {
- // TODO Auto-generated method stub
- name.write(out);
- age.write(out);
- title.write(out);
- }
- /**
- * 这个方法用于定义反序列化过程,它吧序列化后的DataInput的内容还原为Hadoop对象
- */
- @Override
- public void readFields(DataInput in) throws IOException {
- // TODO Auto-generated method stub
- name.readFields(in);
- age.readFields(in);
- title.readFields(in);
- }
- /**
- * 这是用于2个序列化对象之间的比较
- */
- @Override
- public int compareTo(PersonWritable pO) {
- // TODO Auto-generated method stub
- int cmp1 = name.compareTo(pO.name);
- if(cmp1 != 0){
- return cmp1;
- }
- int cmp2 = age.compareTo(pO.age);
- if(cmp2 !=0){
- return cmp2;
- }
- int cmp3 = title.compareTo(pO.title);
- return cmp3;
- }
- /**
- * 定义hashcode是个好习惯,我们还是使用最常用的字段分别乘以不同的素数然后相加的方法
- */
- @Override
- public int hashCode(){
- return name.hashCode()*71+ age.hashCode()*73+title.hashCode()*127;
- }
- @Override
- public boolean equals (Object o ){
- if ( o instanceof PersonWritable){
- PersonWritable pw = (PersonWritable) o;
- boolean equals = name.equals(pw.name) && age.equals(pw.age) && title.equals(pw.title);
- return equals;
- }
- return false;
- }
- @Override
- public String toString(){
- StringBuffer sb = new StringBuffer();
- sb.append("[");
- sb.append("姓名: "+name+",");
- sb.append("年龄: "+age+",");
- sb.append("头衔: "+title);
- sb.append("]");
- return sb.toString();
- }
- }
相关问答
更多-
hadoop 序列化自定数据数据对象[2023-12-09]
write:for循环把points里面的每一个Point对象序列化 readFields:for循环读取Point对象add进points集合中 -
python pyx类怎么序列化 自定义cython类序列话[2022-09-17]
一和三选吧。Cython 是用来写 Python 的 C 绑定用的。 更好的做法是用 Python 和 C++ 都支持的序列化方案,比如 protobuf 之类的。 -
Java自定义序列化(Java Custom Serialization)[2022-07-13]
Java支持自定义序列化 。 阅读自定义默认协议一节。 去引用: 然而,这是一个奇怪而又狡猾的解决方案。 通过使用序列化机制的内置功能,开发人员可以通过在其类文件中提供两种方法来增强正常进程。 这些方法是: private void writeObject(ObjectOutputStream out)throws IOException; private void readObject(ObjectInputStream in)throws IOException,ClassNotFoundExcepti ... -
来自MSDN 正如我所提到的,ISerializable接口非常强大,因为它允许类型完全控制类型的实例如何被序列化和反序列化。 这种力量需要付出代价; 该类型现在负责序列化其所有基类型的字段 。 如果基类型也实现了ISerializable接口,则序列化基类型的字段很简单 - 您只需调用基类型的GetObjectData方法。 有一天,您可能会发现自己定义了一个需要控制其序列化的类型,但其基类型不实现ISerializable接口。 在这种情况下,您的类必须手动序列化基本类型的字段。 From MSDN A ...
-
我想,现在这是不可能的。 但是您可以为每个属性创建两个单独的序列化程序。 我知道,这是一个小解决方法,但它应该工作。 I think, this is not possible now. But you can create two separate serializers for each property. I know, this a little workaround, but it should work.
-
第三方类是实现细节; 坦率地说,在序列化中使用它是一个非常糟糕的主意,因为你完全被限制在一个角落里,并且永远不能改变实现。 您还将面临版本问题的重大风险 - 这是BinaryFormatter无法正常处理的问题。 它可能不是你想听到的,但我提出两个建议: 不要序列化实现细节; 序列化数据 (仅限); 这可能确实需要你编写一个反映实现的DTO,但这通常是一项微不足道的工作 确保你理解BinaryFormatter的含义; 坦率地说,我从不推荐它 - 它有......故障。 至于变通方法:你可以调查序列化代理, ...
-
终于得到了答案。 感谢菲利普在这个链接 。 我所要做的就是这个。 创建InjectableValues的实例 private InjectableValues newInjectableValues() { return new InjectableValues.Std() .addValue("event", "proxy") } 使用此方法在mapper类中设置injectablevalues方法 GeneralDomain readValue = mapper.setInjectable ...
-
答案是肯定的。 这是一个完整的工作示例。 我发明了一些简单的类型: struct InstanceIdentity { int id; }; struct ClassLabel { std::string value; }; struct FeatureGroup { size_t count; }; 使用非侵入式序列化: namespace boost { namespace serialization { template如果您使用自定义序列化,答案是肯定的。 当我们通过重写writeObject方法进行自定义序列化时,您可以控制序列化并可以执行任何操作。 因此,您还可以分配或使用transient字段的值,也可以将其与其他类属性一起编组。 The answer is yes if you are using the custom serializaton. When we do custom serialization by overriding the writeObject method, you take contr ...这是因为Gson无法序列化托管的Realm对象。 您需要首先将其转换为非托管对象,如下所示: new Gson().toJson(realm.copyFromRealm(managedModel)); 看一下这个答案的完整解释Android:Realm + Retrofit 2 + Gson It's because Gson can't serialize a managed Realm object. You need to convert it to an unmanaged object firs ...