我和一群朋友正在做一个 Java 项目,我们需要一些关于通过套接字发送对象的帮助。
到目前为止,我们已经实现了通过套接字发送简单对象(整数、字符串等),使用ObjectOutputStream和ObjectInputStream。然而,我们今天遇到了一个大问题(无论如何对我们来说都是巨大的^^)
我们有一个树结构,我们需要将它从一台 PC 发送到另一台 PC。问题是,在该树的每个节点中,我们都有一个对 BufferedImage 的引用,并且它是不可序列化的。
今天研究了很多,发现可以通过socket的OutputStreamImageIO.write()来发送一个BufferedImage,但是这对我们没有好处,因为我们不需要自己发送BufferedImage,但是整棵树都是它地处。
我们需要的是一种方法(如果存在)来序列化每个 BufferedImage,必要时将其转换为另一个类,同时制作树,并使树的每个节点引用新的可序列化类,因此树可以作为整个物体...
我们真的不关心性能,因为我们发送的树并不大(顶部 10-15 个节点)。在此先感谢您的帮助,对于糟糕的英语深表歉意。哦,这是为了......好吧,一种家庭作业,以防你想记住这一点:-)
谢谢!!
我不断收到此可序列化错误。我的两个班级都实现了它。我似乎找不到问题。我已经完成了所有课程,但仍然找不到原因。它仅发生在较旧的 Android 版本、2.3 及更低版本上。似乎可以在 4.0+ 上使用 find 吗?
更新
是的,这个问题又回到了我身边。
这次我得到
java.lang.RuntimeException:Parcelable 遇到 IOException 写入可序列化对象(名称 = ....datastructs.model.PortfolioAccount)
PorfolioAccount 包含所有 GSON 对象和变量。
以及由此造成的
Caused by: java.io.NotSerializableException: android.os.Handler
我已经检查了所有需要可序列化的类,但仍然找不到任何东西。和以前一样,它只发生在旧的 Android 操作系统版本上。
android serializable android-fragments notserializableexception
我正在尝试使用套接字将客户端连接到服务器。
服务器代码:
ServerSocket server = new ServerSocket(6780);
Socket clientSocket = server.accept();
ObjectInputStream fromClient= new ObjectInputStream(clientSocket.getInputStream());
ObjectOutputStream toClient = new ObjectOutputStream(clientSocket.getOutputStream());
Run Code Online (Sandbox Code Playgroud)
客户端代码:
Socket nodeSocket = new Socket(ServerIP, 6780);
ObjectInputStream fromServer = new ObjectInputStream(nodeSocket.getInputStream());
ObjectOutputStream toServer = new ObjectOutputStream(nodeSocket.getOutputStream());
toServer.writeObject(this);
Run Code Online (Sandbox Code Playgroud)
当客户端连接时,服务器侦听并接受客户端连接。但是当我尝试将我的类对象写入服务器时,“toServer.writeObject(this);” 它抛出
java.io.NotSerializableException: Peer
at java.io.ObjectOutputStream.writeObject0(Unknown Source)
at java.io.ObjectOutputStream.writeObject(Unknown Source)
at Peer.requestEntryNode(Peer.java:47)
at Peer.main(Peer.java:87)
Run Code Online (Sandbox Code Playgroud)
Peer 是我的班级名称。
我试图找出这个异常的原因,它说需要写入的对象必须是可序列化的。我还尝试从 Peer 类实现 Serializable 接口。但这没有帮助。
任何人都可以建议吗?
为什么这样:
package com.example;
import com.example.Foo.Bar.Baz;
import java.io.Serializable; // I did import Serializable...
public class Foo implements Serializable {
public final Bar bar;
public Foo(Bar bar) {
this.bar = bar == null ? new Bar(Baz.ONE) : bar;
}
public static class Bar implements Serializable { // this is line 15, where the compiler error is pointing
public enum Baz {
ONE
}
public final Baz baz;
public Bar(Baz baz) {
this.baz = baz;
}
}
}
Run Code Online (Sandbox Code Playgroud)
给我这个:
[ERROR] <path to file>/Foo.java:[15,44] …Run Code Online (Sandbox Code Playgroud) 如果我重复一个问题,我会提前道歉.如果我是,请转发给相关的帖子.
我有一个JPanel,上面有很多组件.然后将其放置在JFrame上.我想让用户有机会保存他们当前的会话(即序列化JPanel,其子组件值保持不变).然后,用户应该有机会加载前一个会话(基本上是JPanel,其中包含已保存的combox和文本字段条目选择).
我的问题涉及从文件中读取JPanel对象.一旦我从文件中读取JPanel,我是否必须阅读其每个文本字段和组合框,或者我可以简单地用保存的JPanel替换我的JPanel吗?据我所知,唯一的方法是用保存的面板替换当前面板,如下所示:
这有什么可以实现我想要的吗?
谢谢.
问题标题只是说明了一切.我有一个声明如下的字段:
@DatabaseField(canBeNull=false,dataType=DataType.SERIALIZABLE)
List<ScheduleTriggerPredicate> predicates = Collections.emptyList();
Run Code Online (Sandbox Code Playgroud)
根据上下文,predicates可以包含空列表或返回不可变列表Collections.unmodifiableList(List)与ArrayList作为它的参数.因此,我知道有问题的对象是可序列化的,但我无法告诉编译器(以及因此ORMLite)它是什么.因此我得到这个例外:
SEVERE: Servlet /ADHDWeb threw load() exception
java.lang.IllegalArgumentException: Field class java.util.List for field
FieldType:name=predicates,class=ScheduleTrigger is not valid for type
com.j256.ormlite.field.types.SerializableType@967d5f, maybe should be
interface java.io.Serializable
Run Code Online (Sandbox Code Playgroud)
现在,如果只是某种方式来禁用支票,一切显然都会正常工作......
尝试序列化对象时出现以下错误:
Type
'TEST.Common.TestObj`1+<>c__DisplayClass1`1[[TEST.Common.TestEntity,
TEST.Common, Version=1.0.0.0, Culture=neutral,
PublicKeyToken=null],[System.Boolean, mscorlib, Version=4.0.0.0,
Culture=neutral, PublicKeyToken=b77a5c561934e089]]' in Assembly
'Test.Common, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null'
is not marked as serializable.
Run Code Online (Sandbox Code Playgroud)
我[Serializable]在TestObj实体、所有它的基础实体和与其属性相关的所有实体上都有该属性。还有什么可能导致此“未标记为可序列化”错误?
c__DisplayClass1`1甚至是什么意思?
为什么字段不能通过XML序列化程序在C#中序列化,而属性是?我知道属性实际上是方法,但我不明白为什么这应该有所作为.有谁知道答案吗?
非常感谢!
例如,我有:
public class Class1 implements Serializable {
private static final long serialVersionUID = 1L;
private int a;
private int b;
/*Getters and setters here*/
public int getA();
}
public class Class2 implements Serializable {
private static final long serialVersionUID = 1L;
private int a;
private int b;
/*Getters and setters here*/
public int getA();
}
Run Code Online (Sandbox Code Playgroud)
现在我想制作这两种类型的ArrayList.这就是我正在尝试的:
List<Serializable> list= new ArrayList<Serializable>();
Run Code Online (Sandbox Code Playgroud)
我有一个返回Serializable的方法,它返回列表中的对象:
public Serializable get(int i)
{
return list.get(i);
}
Run Code Online (Sandbox Code Playgroud)
但是,当我尝试使用上面两个类中的getter方法(类似于list.get(0).getA())时,会出现一个错误,即没有为Serializable定义getA()方法.我错过了一些简单的东西吗?为了使用getter方法,我应该如何使用上述方法的返回类型?谢谢.
编辑:: 更新代码以显示我关注的问题:更改 Frag 中 mData 的属性会更改 Sender 中的属性 mData 并且它们的内存引用相同..
我正在通过包将自定义数据类传递到子视图中,目的是将数据返回给父视图。因此,我的数据对象作为引用传递很方便,因此可以直接操作。
然而,来自 iOS,这当然是反对函数式编程的。我在这里主要只是好奇,我是否需要做更多的事情来实现 Serializable?或者是打算让 putSerializable 序列化引用,而不是值?
class Sender{
DataClass mData = new DataClass();
void openFragment(){
Bundle bundle = new Bundle();
bundle.putSerializable("Key", mData);
Frag frag = new Frag(); //@6945
//EDIT for test
{
testForEquality(bundle);
}
frag.setArguments(bundle);
pushFragment(frag);//Makes a new view appear on top
}
void testForEquality(Bundle bundle){
DataClass newData = (DataClass) bundle.getSerializable("Key");
Log.e("Equal", "" + (newData == mData); //TRUE
}
}
class Frag{
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle …Run Code Online (Sandbox Code Playgroud) serializable ×10
java ×6
android ×2
c# ×2
sockets ×2
collections ×1
field ×1
ormlite ×1
swing ×1