关于Java序列化的澄清

时间:2016-09-08 09:27:24

标签: java

我正在学习序列化并遇到了这个函数(在Externalization中)。

public void writeExternal(ObjectOutput oi) throws IOException, ClassNotFoundException

我知道该方法创建了一个名为oi的ObjectOutput类型的对象,用于将实例变量写入对象。当我想要了解更多关于ObjectOutput类的内容时,我很惊讶ObjectOutput是一个接口!我认为Java不允许创建类型接口的对象。如果我理解了错误,请告诉我为什么会这样或纠正我。

2 个答案:

答案 0 :(得分:0)

首先,正如' Add reference to Microsoft XML v6.0 library Public Const XML As String = _ "<response>" & _ "<lst name='responseHeader'>" & _ "<int name='status'>0</int>" & _ "<int name='QTime'>0</int>" & _ "<lst name='params'>" & _ "<str name='q'>*:*</str>" & _ "<str name='indent'>true</str>" & _ "<str name='wt'>xml</str>" & _ "</lst>" & _ "</lst>" & _ "<result name='response' numFound='5429' start='0'>" & _ "<doc>" & _ "<int name='idProductCategory'>2</int>" & _ "<str name='categoryname'>Live Animals</str>" & _ "<int name='categoryLevel'>2</int>" & _ "<str name='bestOfferEnabled'>false</str>" & _ "<str name='leafCategory'>true</str>" & _ "<int name='parentCategoryId'>1</int>" & _ "<long name='_version_'>1535190804282212352</long>" & _ "</doc>" & _ "</result>" & _ "</response>" Sub test() Dim xmlDocument As MSXML2.DOMDocument60 Set xmlDocument = New DOMDocument60 If Not xmlDocument.LoadXML(XML) Then Err.Raise xmlDocument.parseError.ErrorCode, , xmlDocument.parseError.reason End If Dim nodeIdProductCategory As IXMLDOMNode Set nodeIdProductCategory = xmlDocument.SelectSingleNode("/response/result/doc/int[@name='idProductCategory']") If Not nodeIdProductCategory Is Nothing Then MsgBox nodeIdProductCategory.text Else MsgBox "Node witd name 'idProductCategory' was not found." End If End Sub 在评论中指出的那样,trappski并未创建任何内容。 writeExternal是通过调用ObjectOutput的任何代码传递给它的参数。

接口的诀窍是他们是一个&#34;合同&#34;。您无法从接口创建对象,但您可以创建实现该接口的类,然后从这些类创建对象。然后,您可以使用那些在预期接口的任何地方实现接口的类的对象。

在这种情况下,如果你有一个writeExternal类实现BigObjectOutput,那么:

ObjectOutput

然后您可以像这样创建class BigObjectOutput implements ObjectOutput { // code... } 类型的对象:

BigObjectOutput

并将其传递给您的方法,因为BigObjectOutput bigObject = new BigObjectOutput; 实现了BigObjectOutput

ObjectOutput

你为什么要这样做?这样您就可以传入任何类型实现writeExternal(bigObject); 的对象:

ObjectOutput

因此,如果class LittleObjectOutput implements ObjectOutput { // code... } LittleObjectOutput littleObject = new LittleObjectOutput(); writeOutput(littleObject); 接受任何类型实现writeOutput接口的对象,那么它OutputObject会更有用。

答案 1 :(得分:0)

感谢你的解释@Emma。你的意思是说类LittleObjectOutput扩展BigObjectOutput实现ObjectOutput {   //代码...... }

LittleObjectOutput littleObject = new LittleObjectOutput();

的writeExternal(littleObject);

  • 意味着如果父级和孩子都可以使用该函数,那么该函数会有用吗?