在C#中,考虑我们有一个泛型类和一个具体类
[Serializable]
public class GenericUser
{ ...
[Serializable]
public class ConcreteUser : GenericUser
{ ...
Run Code Online (Sandbox Code Playgroud)
是否有必要将ConcreteUser标记为[Serializable]或继承将处理它?
我想将 json 字符串响应从 API 转换为对象:
val obj = Json.decodeFromString<MyModel>(jsonResponseString)
Run Code Online (Sandbox Code Playgroud)
我的数据类:
@Serializable
data class MyModel(
@SerializedName("field") val field: String
)
Run Code Online (Sandbox Code Playgroud)
它看起来非常简单,并且可以在调试模式下运行!
但是,当编译 AppBundle、以发布模式构建并从 Play Store 内部测试下载应用程序时,我收到以下错误:
Serializer for class '...' is not found. Mark the class as @serializable or provide the
serializer explicitly.
kotlinx.serialization.internal.Platform_commonKt.serializerNotRegistered
Run Code Online (Sandbox Code Playgroud) 要使类可序列化,我们执行以下操作:
class A implements Serializable {
transient Object a;
}
Run Code Online (Sandbox Code Playgroud)
而不是这个:
serializable class A {
transient Object a;
}
Run Code Online (Sandbox Code Playgroud)
为什么,如果我们想使类可序列化,我们是否实现了一个特殊的接口.如果我们想要排除某些字段,我们会使用关键字 transient?为什么两种情况下都没有使用特殊关键字?我的意思是有什么理由以不同的方式做同样的事情吗?我知道,没有这样的关键字,serializable但为什么不引入它而不是特殊的界面Serializable?
我现在明白scala @serializable对象可以和Java Serializable对象一样使用.在Java Serializable对象中,您可以覆盖以更改对象流的方式:writeObject(ObjectOutputStream)/ readObject(ObjectOutputStream).
你可以覆盖或注入scala @serializable对象的方法,允许你改变对象的序列化方式吗?
我创建了一个类,它有几个成员变量,所有这些变量都是可序列化的...除了一个Bitmap!我试图扩展位图并实现可序列化,而不是认为Bitmap是最终类.
我想保存课程(它基本上形成了游戏的当前状态),因此玩家可以提升并加载游戏.
我看到它的方式我有两个选择:1)找到另一种方法来保存游戏状态.任何帮助在这里将不胜感激.
2)比较将位图成员变量更改为int,并创建一个BitmapGetter类,该类具有基于int返回位图的静态方法.(这个选项并不容易,因为我的类包含了很多位图可能性,而且我创建游戏的方式意味着需要付出巨大的努力.
基本上我没有人可以责备,但我自己懒得创造一个位图变量而不考虑,但我会感激任何帮助......
我必须遗漏一些非常明显的东西.我是C#的新手,但已经用C/C++编程多年了,很抱歉,如果这是一个非常明显的东西;)
[请参阅编辑以获取新问题]
我正在尝试创建一个包含UserControl的节点.我有控件出现在WinForm设计器中,我可以添加节点.但是,当我尝试运行代码时,我收到以下错误:
属性"节点"的代码生成失败.错误是:程序集'应用程序中的'Type App.Node',版本= 1.0.0.0,Culture = neutral,PublicKeyToken = null'未标记为可序列化.
然后我添加的节点都没有显示出来.
这开始让我发疯,据我所知,它被标记为可序列化.
该节点定义如下:
[Serializable]
public class Node : MarshalByRefObject
{
public Node()
{
}
public Node( String text )
{
this.Text = text;
this.Checked = false;
this.Complete = false;
}
public String Text { get; set; }
public bool Checked { get; set; }
public bool Complete { get; set; }
public bool Selected { get; set; }
};
Run Code Online (Sandbox Code Playgroud)
然后我定义一个"集合"如下:
[Serializable]
public class NodeCollection : List< Node >
{
public …Run Code Online (Sandbox Code Playgroud) 我一直在开发Android应用程序,但最近才进入Fragments,因此我遇到了很多学习如何使用它们的问题.我的应用程序中的一个活动有四个不同的片段,每个片段向用户显示一个项目列表.首先创建每个片段,并且仅在选择另一个选项卡时显示一次并隐藏.一旦创建了这些片段中的每一个,就将JSONObjects的ArrayList作为参数传递给片段,如下所示
ft = fm.beginTransaction();
if(currentFragment !=null){
ft.hide(currentFragment);
}
if(whereFragment !=null){
ft.show(whereFragment);
}else{
if(mPlaceList.size()>0){
Bundle bundle = new Bundle();
bundle.putSerializable("array", mPlaceList);
whereFragment = new WhereFragment();
whereFragment.setArguments(bundle);
ft.add(R.id.newpost_container,whereFragment, "whereFragment");
}
}
ft.commit();
currentFragment = whereFragment;
Run Code Online (Sandbox Code Playgroud)
片段中收到了arraylist,一切正常.
actList = (ArrayList<JSONObject>) getArguments().getSerializable("array");
doingAdapter = new DoingAdapter(getActivity(), actList);
actListView.setAdapter(doingAdapter);
Run Code Online (Sandbox Code Playgroud)
父活动中有一个按钮可启动设备摄像头.一旦发生这种情况并且片段中的onPause方法被调用,应用程序崩溃,我在Logcat中收到此错误
logcat的:
06-23 17:51:31.190: E/ACRA(29221): com.parspake.anar fatal error : Parcel: unable to marshal value {"type":"act","id":"5327f9827f49143f3a001c76","title":"????","actType":"where"}
06-23 17:51:31.190: E/ACRA(29221): java.lang.RuntimeException: Parcel: unable to marshal value {"type":"act","id":"5327f9827f49143f3a001c76","title":"????","actType":"where"}
06-23 17:51:31.190: E/ACRA(29221): at android.os.Parcel.writeValue(Parcel.java:1235)
06-23 17:51:31.190: E/ACRA(29221): at android.os.Parcel.writeList(Parcel.java:622)
06-23 …Run Code Online (Sandbox Code Playgroud) 是否有一种明确的方法可以阻止ProGuard将类更改为实现接口?
我有一个实现的类java.io.Serializable,让我们称之为com.my.package.name.Foo.我发现在运行ProGuard后,它不再实现了Serializable.我得到null我从投后Serializable,以Foo和false,如果我请与一个实例instanceof Serializable.我已确保将ProGuard设置为忽略此类:
-keep class com.my.package.name.Foo
Run Code Online (Sandbox Code Playgroud)
我也尝试过:
-keep class com.my.package.name.Foo { *; }
Run Code Online (Sandbox Code Playgroud)
我也尝试了整个包:
-keep class com.my.package.name.** { *; }
Run Code Online (Sandbox Code Playgroud)
要么:
-keep class com.my.package.** { *; }
Run Code Online (Sandbox Code Playgroud)
并且还要保留所有Serializable课程:
-keep class * implements java.io.Serializable { *; }
Run Code Online (Sandbox Code Playgroud)
但无济于事.我在兄弟包(大致:)中有另一个类,com.my.package.name2.Bar它也实现Serializable和使用类似但没有问题.
我不确定它是否相关,但我将它装在一个罐子里用于Android.使用这些类的代码包括将它们放入Bundles中,这就是我需要的原因Serializable.我认为也许某种程度上ProGuard认为它Foo从未被用作a Serializable但似乎不太可能,因为我将它作为参数传递给我,Bundle.putSerializable(String, Serializable)并且我做了隐式演员:Serializable serializable = foo;.事实上,当我调试时,我可以看到Fooget into Bundle …
我曾经使用Serializable对象将它们保存在filesytem中并读取它们以便做任何我想做的事情.但是当你必须在活动之间传递数据时,序列化很慢,所以我读了比推荐使用Parcelable.然后我做了,是的,它更快!但现在,我有一点问题.由于Parcelable针对IPC进行了优化,因此它们不可序列化,无法保存到文件中.所以我想知道是否可以这样做.
此外,如果我决定为我的类实现Parcelable和Serializable接口,但只使用Parcelable在我的活动之间传递数据,我将能够将类保存到文件中.但我想,因为我使用serializable(只保存,不传递数据),这不是一个好主意哼哼?
我也想过使用Gson库,从类中序列化数据,并将JSON保存到文件中,并重用Gson反序列化JSON以获取我的Parcelable对象.这似乎是个好主意吗?性能怎么样?
感谢大家的回答!
J.
假设我有一个包含许多字段的User类:
public class User {
public Integer id;
public String name;
public String username;
public Integer age;
public Address address;
public String phoneNumber;
public String email;
}
Run Code Online (Sandbox Code Playgroud)
但我并不总是需要前端的所有用户属性。每个屏幕只需要一些用户字段。为每个屏幕创建 DTO 类是一个好习惯吗,因为它们访问不同的属性?像这样:
class UserToScreenADTO implements Serializable {
public String name;
public String email;
}
class UserToScreenBDTO implements Serializable {
public String phoneNumber;
public Address address;
}
class UserToScreenCDTO implements Serializable {
public Integer id;
public String username;
public String email;
}
Run Code Online (Sandbox Code Playgroud) serializable ×10
android ×5
java ×3
c# ×2
bitmap ×1
collections ×1
dto ×1
gson ×1
hibernate ×1
jsonobject ×1
kotlin ×1
oop ×1
parcelable ×1
proguard ×1
properties ×1
scala ×1