我知道如果父级没有实现Serializable接口,则无法序列化父成员变量。
我已经创建了一个示例程序并试图找到一种方法(无论多么笨拙)序列化父classe的成员变量而不更改它以实现可序列化。
下面是代码:
class s
{
int i;
public int getI() {
return i;
}
public void setI(int i) {
this.i = i;
}
public int getJ() {
return j;
}
public void setJ(int j) {
this.j = j;
}
int j;
private int fun(){
return 1;
}
}
class m extends s implements Serializable
{
int k;
int l;
public int getK() {
return k;
}
public void setK(int k) {
this.k = k;
}
public int getL() {
return l;
}
public void setL(int l) {
this.l = l;
}
public int fun(){
return 2;
}
}
class n1{
public static void main(String...s)
{
m m1 = new m();
m1.setI(100);
m1.setJ(101);
m1.setK(401);
m1.setL(701);
try {
OutputStream os = new FileOutputStream(new File("d:/aaa.data"));
ObjectOutputStream oos = new ObjectOutputStream(os);
oos.writeObject(m1);
InputStream is = new FileInputStream(new File("d:/aaa.data"));
ObjectInputStream ois = new ObjectInputStream(is);
m m2 = (m)ois.readObject();
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
我很感激你对这件事的想法,肯定是upvote :) 感谢
答案 0 :(得分:1)
您可以通过向子类添加以下方法来解决此问题:
.category {
position: relative;
}
.category > img {
display: block;
}
.category-header {
background-color: #870000;
display: block;
color: #FFF;
font-family:"Oswald", sans-serif;
text-transform: uppercase;
padding: 10px 40px;
position: absolute;
bottom: 0;
left: 0;
}
.category-header h4 {
margin: 0px;
}
方法,它也序列化了非序列化类的成员。writeObject()
方法。Object Serialization Specification中定义了这些方法所需的签名以及它们可以/必须做的事情。
答案 1 :(得分:0)
回答我自己的问题。
感谢@Ramanlfc了解序列化代理模式。
序列化代理模式对于与此完全相同的条件非常方便;
这是在上面的代码中实现序列化代理模式的代码。
class m extends s implements Serializable {
int k;
int l;
public m() {
}
public m(int i, int j, int k, int l) {
this.i = i;
this.j = j;
this.k = k;
this.l = l;
}
private static class MProxy implements Serializable {
int i;
int j;
int k;
int l;
public MProxy(m point) {
this.i = point.getI();
this.j = point.getJ();
this.k = point.getK();
this.l = point.getL();
}
private Object readResolve() {
return new m(i, j, k, l);
}
}
private Object writeReplace() {
return new MProxy(this);
}
public int getK() {
return k;
}
public void setK(int k) {
this.k = k;
}
public int getL() {
return l;
}
public void setL(int l) {
this.l = l;
}
public int fun() {
return 2;
}
}
为了实现这种模式,我添加了一个新类MProxy
。这是一种包含子类状态副本的容器。
并编写了一个方法writeReplace()
来覆盖默认的序列化writeobject行为。它现在返回MProxy
而不是this
的实例,然后将其写入文件。
这里没有对父类进行任何更改。