我有一个由ArrayList组成的疯狂结构,每个项目都包含一个ArrayList of Object。这些对象可以是长数组或字符串。我需要序列化这个疯狂的结构,但无法实现我的目标。之后反序列化怎么样?我了解序列化和反序列化的基础知识,但不确定这样的结构。非常感谢您的帮助。
我的作品:
private void writeObject(ObjectOutputStream oos) throws IOException
{ oos.defaultWriteObject();
// Write out all elements in the proper order.
for (Object ohs : openingHours.getAllOpeningHours())
{
oos.writeObject(ohs);
// ArrayList<Object> times = (ArrayList<Object>)ohs;
// for(Object oh:times)
// if (oh instanceof String)
// {
// oos.writeChars((String) oh);
// } else if (oh instanceof long[])
// {
// long[] time = (long[])oh;
// oos.writeLong(time[0]);
// oos.writeLong(time[1]);
// }
}
}
Object类型的“ohs”应该始终是ArrayList,我发现它应该已经可以序列化了,但我想它并没有那么简单
我建议将您的“疯狂结构”更改为您感觉更舒服的形式。在另一个对象列表中包含一个对象列表,其中第二个列表可以包含一个长[2]或一个字符串,看起来您的设计可能需要一些审查。
我不知道为什么需要用一个字符串和一个长[]来表示开放时间,但我想如果将它们移动到实现Serializable的单独类中,也不会有什么坏处。
类似这样:
public class OpeningHours implements Serializable{
private interface OpeningHour{
public long[] getOpeningHourLongs();
public String getOpeningHourString();
}
public static final class LongArrayOpeningHour implements OpeningHour, Serializable{
private final long[] openingHour;
public LongArrayOpeningHour(long[] openingHour) {
super();
assert openingHour.length == 2;
this.openingHour = openingHour;
}
@Override
public long[] getOpeningHourLongs() {
return openingHour;
}
@Override
public String getOpeningHourString() {
return null; // ??
}
@Override
public String toString() {
return Arrays.toString(openingHour);
}
}
public static final class StringOpeningHour implements OpeningHour, Serializable{
private static final long serialVersionUID = -8424663833219027462L;
private final String openingHour;
public StringOpeningHour(String openingHour) {
super();
this.openingHour = openingHour;
}
@Override
public long[] getOpeningHourLongs() {
return null; // ??
}
@Override
public String getOpeningHourString() {
return openingHour;
}
@Override
public String toString() {
return openingHour;
}
}
private final List<OpeningHour> openingHours;
public OpeningHours() {
this.openingHours = new ArrayList<>();
}
public void addOpeningHour(OpeningHour hour){
this.openingHours.add(hour);
}
@Override
public String toString() {
return openingHours.toString();
}
public static void main(String[] args) {
OpeningHours openingHours = new OpeningHours();
openingHours.addOpeningHour(new StringOpeningHour("I am an opening hour based on a String value"));
openingHours.addOpeningHour(new LongArrayOpeningHour(new long[]{1,2}));
System.out.println("openingHours before serialization: " + openingHours );
// write OpeningHours
OutputStream fos = null;
String filename = ... // insert filename here
try {
fos = new FileOutputStream( filename );
ObjectOutputStream o = new ObjectOutputStream( fos );
o.writeObject(openingHours);
} catch (IOException e) {
System.err.println(e);
} finally {
if (fos != null) {
try {fos.close();} catch (IOException e1) {}
}
}
// read OpeningHours
InputStream fis = null;
try{
fis = new FileInputStream( filename );
ObjectInputStream o = new ObjectInputStream( fis );
openingHours = (OpeningHours) o.readObject();
System.out.println("openingHours after deserialization: " + openingHours );
} catch (IOException e) {
System.err.println( e );
} catch ( ClassNotFoundException e ) {
System.err.println( e );
}finally {
if (fis != null) {
try {fis.close();} catch (IOException e1) {}
}
}
}
}
我相信为这些结构提供单独的类肯定会提高代码的可读性,并从长远来看有助于更好地维护和理解代码。
我看到了您的代码正在运行的注释,但下面是您的代码片段中的两个观察结果。
首先是您使用的instanceof运算符具有long[]数据类型,这是原始数据类型。运算符实例不能与原始数据类型一起使用。
其次,尝试将Long[]值存储在数组列表中,而不是long[],因为Long已经实现了可序列化类。
所以,就像经常发生的那样,在发布问题后,我意识到哪里出了问题。如果有人有类似的问题,这里是解决方案。
我有一个对象的ArrayList,它们的一个属性称为OpeningHour。OpeningHour是一个POJO,有一个属性是ArrayList类型的
FileOutputStream fosp = mContext.openFileOutput(FILENAME, Context.MODE_PRIVATE);
ObjectOutputStream oosp = new ObjectOutputStream(fosp);
oosp.writeObject(mBusinessSet); //mBusiness set is ArrayList or Business.
//Business contains OpeningHours attribute
问题内容: 我试图序列化和反序列化内部对象的数组列表: HairList对象也是一个可序列化的对象。 此代码执行返回以下错误: 排队 我不知道我在做什么错。你能给个小费吗? 更新: 解决: 仅使用HairBirt的本机数组而不是ArrayList即可工作: 代替 感谢大家的帮助。 问题答案: 不要使用-而是使用二进制数据并对它进行base64编码,以将其转换为字符串而不会丢失信息。 我强烈怀疑这是
我正在尝试使用kryo序列化和反序列化到二进制。我想我已经完成了序列化,但似乎无法反序列化。下面是我正在处理的代码,但最终我想存储一个字节[],然后再次读取它。文档只显示了如何使用文件。
问题内容: 每当我尝试序列化文件时,都会收到错误消息:FileNotFound。不知道为什么。这是我的FileHelper代码: 问题答案:
问题内容: 我尝试过在Java和Android之间实现跨平台序列化。我使用了Serializable,并将我的代码在Android中与台式机Java放在同一软件包中。 来源:java-desktop序列化 资料来源:Android-反序列化 学生是一类,实现了Serializable。在桌面上,我将学生实例序列化为“ thestudent.dat”。我将此文件放在Android设备上的SD卡上,并
问题内容: 我注意到存储在Redis中的某些序列化对象在反序列化方面遇到问题。 当我对Redis中存储的对象类进行更改时,通常会发生这种情况。 我想了解问题,以便为解决方案设计一个清晰的方案。 我的问题是,什么导致反序列化问题?移除公共/私人财产会引起问题吗?也许添加新属性?向类添加新功能会产生问题吗?那么更多的构造函数呢? 在我的序列化对象中,我有一个属性Map,如果我更改(更新了一些属性,添加
问题内容: Golang中将结构序列化和反序列化为字符串的最佳方法(完整性和性能)是什么,反之亦然? 例如,如果我有这个结构: 我想将其存储在Redis上并取回。我试过保存,整型和字符串,这很好,但是如何存储结构对象? 问题答案: 使用gob和base64可以解决问题,例如: 当您需要序列化自定义结构或类型(例如struct)时,只需添加以下行:
主要内容:1 Java序列化和反序列化,2 Java序列化的优点,3 java.io.Serializable接口,4 Java ObjectOutputStream,5 Java ObjectInputStream,6 Java序列化的例子,7 Java反序列化的例子1 Java序列化和反序列化 Java中的序列化是一种将对象状态写入字节流的机制。它主要用于Hibernate,RMI,JPA,EJB和JMS技术。 序列化的反向操作称为反序列化,其中字节流被转换为对象。序列化和反序列化过程与平台
FAQs in section [36]: [36.1]“序列化”是什么东东? [36.2] 如何选择最好的序列化技术? [36.3] 如何决定是要序列化为可读的(“文本”)还是不可读的(“二进制”)格式? or non-human-readable ("binary") format?") [36.4] 如何序列化/反序列化数字,字符,字符串等简单类型? [36.5] 如何读/写简单类型为可读的