如何将Enum对象添加到Android Bundle?
我一直在阅读很多文章和文章,颂扬Parcelable在Serializable上的速度.我一直在使用两种方法来通过Intents在Activities之间传递数据,并且在两者之间切换时还没有注意到任何速度差异.我必须传输的典型数据量是5到15个嵌套对象,每个对象有2到5个字段.
由于我有大约30个必须可转移的类,因此实现Parcelable需要大量的样板代码来增加维护时间.我目前的要求之一是编译的代码应该尽可能小; 我希望通过使用Serializable over Parcelable可以节省一些空间.
我应该使用Parcelable还是没有理由在Serializable上使用它来处理这么少量的数据?还是有另一个原因我不应该使用Serializable?
我最近一直在努力学习更多,并且通常测试Java的工作和个人项目的序列化,我必须说我越了解它,我就越不喜欢它.这可能是由错误的信息造成的,所以这就是为什么我要问你们这两件事:
1:在字节级别,序列化如何知道如何将序列化值与某些类匹配?
我在这里的一个问题是我用ArrayList进行了一个小测试,其中包含值"one","two","three".在序列化之后,字节数组占用了78个字节,这对于如此少量的信息(19 + 3 + 3 + 4字节)来说似乎非常多.当然,这肯定会有一些开销,但这导致了我的第二个问题:
2:序列化可以被认为是持久化对象的好方法吗?现在很明显,如果我使用一些自制的XML格式,持久性数据将是这样的
<object>
<class="java.util.ArrayList">
<!-- Object array inside Arraylist is called elementData -->
<field name="elementData">
<value>One</value>
<value>Two</value>
<value>Three</value>
</field>
</object>
Run Code Online (Sandbox Code Playgroud)
与XML一般来说,它有点膨胀,占用138个字节(没有空格,即).JSON中也是如此
{
"java.util.ArrayList": {
"elementData": [
"one",
"two",
"three"
]
}
}
Run Code Online (Sandbox Code Playgroud)
这是75字节所以已经比Java的序列化略小.使用这些基于文本的格式,显然必须有一种方法可以将基本数据表示为文本,数字或两者的任意组合.
那么回顾一下,序列化如何在字节/位级别上工作,何时应该使用以及何时不应该使用序列化以及序列化的真正好处除了它是Java的标准之外?
我有一个奇怪的问题.我环顾网络但没有找到答案.我还是android编程的初学者.让我们走吧:
我想做的就是用一些数据调用第二个Activity.它适用于小数据,但如果数据变大,第二个Activity将不会显示,第一个Activity将完成.这是我调用方法的代码:
Intent intent = new Intent(ActivitySearch.this,ActivityResults.class);
Bundle bundle = new Bundle();
bundle.putParcelableArrayList("data", searchList);
intent.putExtras(bundle);
startActivity(intent);
Run Code Online (Sandbox Code Playgroud)
接收数据的部分并不重要.即使我不尝试读取该包,也不会调用该活动.我用以下几行测试了这个:
@Override
public void onCreate(Bundle savedInstanceState) {
Log.d("DEBUG","ActivityResult::onCreate()");
super.onCreate(savedInstanceState);
Run Code Online (Sandbox Code Playgroud)
OnCreate() 永远不会被召唤.
也许你的一个人有个主意......谢谢你的帮助!
编辑:至少我忘了:这只发生在ICS下.该应用程序就像一个姜饼和froyo的魅力.
Edit2:Logcat
10-10 14:49:46.951: D/OpenGLRenderer(21696): Flushing caches (mode 0)
10-10 14:49:47.011: V/ActivityThread(22429): com.example.amazonsearch white listed for hwui
10-10 14:49:50.821: W/IInputConnectionWrapper(21696): showStatusIcon on inactive InputConnection
Run Code Online (Sandbox Code Playgroud) java android android-activity android-4.0-ice-cream-sandwich
Java语言从添加枚举中获益匪浅; 但遗憾的是,在具有不同代码级别的系统之间发送序列化对象时,它们无法正常工作.
示例:假设您有两个系统A和B.它们都以相同的代码级别开始,但在某些时候开始在不同的时间点看到代码更新.现在假设有一些
public enum Whatever { FIRST; }
Run Code Online (Sandbox Code Playgroud)
还有其他对象可以引用该枚举的常量.这些对象被序列化并从A发送到B,反之亦然.现在考虑B有更新版本的Whatever
public enum Whatever { FIRST; SECOND }
Run Code Online (Sandbox Code Playgroud)
然后:
class SomethingElse implements Serializable { ...
private final Whatever theWhatever;
SomethingElse(Whatever theWhatever) {
this.theWhatever = theWhatever; ..
Run Code Online (Sandbox Code Playgroud)
获得实例化...
SomethingElse somethin = new SomethingElse(Whatever.SECOND)
Run Code Online (Sandbox Code Playgroud)
然后序列化并发送到A(例如,作为一些RMI调用的结果).这很糟糕,因为现在在A上反序列化时会出现错误:A知道Whatever枚举类,但是在没有SECOND的版本中.
我们认为这很艰难; 现在我非常渴望将枚举用于实际上"完美用于枚举"的情况; 仅仅因为我知道我以后不能轻易扩展现有的枚举.
现在我想知道:有没有(好)策略来避免与枚举的这种兼容性问题?或者我真的要回到"pre-enum"时代; 并且不要使用枚举,但必须依赖于我在整个地方使用普通字符串的解决方案?
更新:请注意,使用serialversionuid对此没有任何帮助.那件事只能帮助你使一个不相容的变化"更明显".但重点是:我不关心为什么反序列化失败 - 因为我必须避免它发生.而且我也无法改变序列化对象的方式.我们正在做RMI; 我们正在序列化为二进制; 我没办法改变它.
我想从 rest api 调用返回一个枚举列表,并让它以 JSON 格式显示枚举的值而不仅仅是枚举名称。目前我的 rest 调用返回 json 看起来像:
{
"responses": [
"ACTION_TAKEN",
"IGNORED",
"UNDETECTED"
]
}
Run Code Online (Sandbox Code Playgroud)
但是,我希望它更像(或像这样):
{
"responses": [
{
"name":"ACTION_TAKEN",
"value":"Action Taken"
},
{
"name":"IGNORED",
"value":"Ignored"
},
{
"name":"UNDETECTED",
"value":"Undetected"
}
]
}
Run Code Online (Sandbox Code Playgroud)
我的枚举看起来像:
public enum Response {
ACTION_TAKEN ("Action Taken"),
IGNORED ("Ignored"),
UNDETECTED("Undetected");
private String value;
Response(String value) {
this.value = value;
}
public String getValue() {
return this.value;
}
@Override
public String toString() {
return value;
}
}
Run Code Online (Sandbox Code Playgroud)
我的模型对象看起来像这样。为了这个例子,它只有一个枚举值列表。
@XmlRootElement
@XmlAccessorType(XmlAccessType.FIELD)
public class StaticData …Run Code Online (Sandbox Code Playgroud) java ×4
android ×3
enums ×3
android-4.0-ice-cream-sandwich ×1
json ×1
parcelable ×1
rest ×1
serializable ×1