2015-09-05 73 views
2

我对Serializable接口的优点有些困惑。 我会进一步解释我的问题。实现Serializable为您提供什么优势而不是简单的方法?

比方说,我有一个叫狗类。

public class Dog { 

    private String name; 
    private int age; 

    public Dog(String name, int age) { 
     this.name = name; 
     this.age = age; 
    } 

} 

所以,现在我如果我需要将其转换成字符串,我可以覆盖toString方法,使其像做

@Override 
public String toString() { 
    return name + "=" + age; 
} 

或创建一个具有一个方法。

现在,是什么实现Serializable接口做不同?或者是什么让它变得更好?

感谢您的帮助, BetaNyan。

回答

0

序列化产生一个二进制格式保存/恢复数据。这与toString()不同,因为toString()是用于调试的人类(文本)格式,它不是必然可逆的(例如,它可以简单地总结理解该项目所需的关键信息,并且没有自动生成的代码来转换内容回到对象中)。如果你把你的对象序列化,你可以读/写使用对象的对象(Input | Output)流。

但是,与其他语言不同,还有更好的二进制序列化方法,它们与版本控制有更好的关系。如果您正在寻找到持续性/数据通信,看看Protocol BuffersMessagePack

+0

谢谢!真的很感激它。另一个简单的问题是,我将如何利用它?就像我想发送一个Dog变量到某个东西一样,我会怎么做呢? (顺便说一句,我知道如何通过连接发送字符串等) – BetaNyan

+0

那么,我不会推荐使用Serializable来完成它,但是使用Serializable,您可以在连接上层叠一个ObjectOutputStream,然后将数据写入ObjectOutputStream。使用协议缓冲区(我的首选解决方案),您将使用协议缓冲区语法来声明“Dog”消息,并且您将使用其自动生成的toByteArray(),toByteString()或writeTo()方法来写入获取二进制编码格式的数据并将其写入流。 –

+0

感谢您的帮助! – BetaNyan

0

因此,有两件事情:

  1. toString()

    toString()为您提供了一个方法来打印东西,你希望他们的方式。所以,当有人试图打印您的狗类的状态,他们会看到一些有意义的事情,而不是[email protected]

  2. Serializable

    序列化是没有任何方法来覆盖标记接口,但是允许你保存状态你的对象在磁盘上。假设您想要将Dog对象状态保存在驱动器上并将其移植到运行在不同操作系统上的其他网络上,则可以使用序列化过程安全地将驱动器中的对象状态解码出来。

toString()Serialization是不同的概念。

+0

感谢您的解释,这让我感到困惑。 – BetaNyan

相关问题