我知道Parcelable(快)和Serializable(慢)之间的性能差异.但是,我需要持久存储某些应用程序信息,而不仅仅是在一个生命周期内,因此onSaveInstanceState和使用Parcelable对象的相关方法是不合适的.
所以我把注意力转向了Serializable.主要是我有AbstractList类型存储 - 这很好,因为它们实现Serializable.然而,我存储在其中的许多类型是Parcelable但不是Serializable,例如RectF.
我认为"没问题",因为我可以轻松地生成一个包,Parcelable.writeToParcel(parcel, flags)然后调用marshall()它来创建一个byte[]我可以序列化和反序列化的包.我想我会使用泛型; 创建一个SerializableParcelable<Parcelable> implements Serializable类,为Parcelable我希望序列化的所有类型提供一个适合的解决方案.然后我会将每个RectF存储在这个包装器中ArrayList,然后看看它的Parcelable内容是否可序列化.
但是,API文档规定marshall()不得将其用于持久存储:
public final byte [] marshall()
返回宗地的原始字节.
您在此处检索的数据不得放在任何类型的持久存储中(在本地磁盘上,通过网络等).为此,您应该使用标准序列化或其他类型的通用序列化机制.Parcel编组表示针对本地IPC进行了高度优化,因此不会尝试保持与在不同版本的平台中创建的数据的兼容性.
所以现在我被卡住了.我可以忽略这个警告并遵循我上面概述的路线,或者通过扩展Parcelable我想要序列化和创建定制序列化方法的每个人来避免这个问题,这似乎非常浪费时间和精力.
有没有人知道Parcelable没有使用序列化对象的'正确'快捷方式marshall()?或者,如果不注意指定的警告,我应该继续吗?也许SQLite数据库是可行的方法,但我不确定并希望得到你的建议.
非常感谢.
参加考试,考试说我错了.以黄色标记的答案是假定的正确答案.
在下面的引用中,我认为粗体标记的部分是错误的:"Serializable属性不是由派生类继承的,因此如果您只使用Serializable属性标记Encyclopedia类,则运行时将在尝试序列化时抛出异常名称字段 ".

我实际上创建了一个示例项目,其中包含一个Animal类和一个Cat派生自该类的类.我标记了Cat课程[Serializable]而Animal课程没有.
我能够成功地序列化和反序列化Cat类,包括Animal属性.
这是.NET版本问题吗?考试是70-536,所以它的目标是2.0.
是否有可能创建类型的一般方法T,其中T具有特定属性?
例如:
public static XmlDocument SerializeObjectToXml<T>(T obj)
{
//...
}
Run Code Online (Sandbox Code Playgroud)
我想只序列化一个带有Serializable和/或DataContract属性的类:
[Serializable]
[DataContract(Name = "viewModel", Namespace = "ns")]
internal class ViewModel
{
//...
}
Run Code Online (Sandbox Code Playgroud) 我最近遇到了一个奇怪的问题,在Oracle数据库中编程:在一个可序列化的事务中,我做了一个大量插入(INSERT ... SELECT),然后立即打开一个带有SELECT的变量表上的游标.我假设这个游标将包含新插入的行,但令我惊讶的是,它的内容不稳定,有时包括所有新插入的行,有时只包含一个子集.
我通过在打开光标之前提交解决了这个问题,但这种行为让我感到困惑.可以在同一事务中插入后进行选择,而不进行干预提交,实际上是否可信?或者这种行为是否与可序列化的事务有关?
后续:当我尝试创建一个可重现的测试用例时,我只能在添加索引后获得此行为(在这种情况下是主键索引,在实际代码中它是常规索引).也许问题在于构建索引所花费的时间,因此SELECT实际上使用不完整的索引来检索结果?无论如何,这是一个可重现的测试用例:
-- Create empty source table
CREATE TABLE TEST_CASE_1 AS
(SELECT 'CONTENT' AS CONTENT
FROM DUAL
WHERE 1 = 2)
-- Add primary key
ALTER TABLE TEST_CASE_1
ADD CONSTRAINT TEST_CASE_1_PK PRIMARY KEY (CONTENT);
-- Create empty destination table
CREATE TABLE TEST_CASE_2 AS
(SELECT 'CONTENT' AS CONTENT
FROM DUAL
WHERE 1 = 2)
-- Example of faulty code
BEGIN
SET TRANSACTION ISOLATION LEVEL SERIALIZABLE;
-- Populate with 100.000 rows (I used ALL_OBJECTS but any source of …Run Code Online (Sandbox Code Playgroud) 我在Spark遇到一个关于序列化的一个非常奇怪的问题.代码如下:
class PLSA(val sc : SparkContext, val numOfTopics : Int) extends Serializable
{
def infer(document: RDD[Document]): RDD[DocumentParameter] = {
val docs = documents.map(doc => DocumentParameter(doc, numOfTopics))
docs
}
}
Run Code Online (Sandbox Code Playgroud)
其中Document定义为:
class Document(val tokens: SparseVector[Int]) extends Serializable
Run Code Online (Sandbox Code Playgroud)
和DocumentParameter是:
class DocumentParameter(val document: Document, val theta: Array[Float]) extends Serializable
object DocumentParameter extends Serializable
{
def apply(document: Document, numOfTopics: Int) = new DocumentParameter(document,
Array.ofDim[Float](numOfTopics))
}
Run Code Online (Sandbox Code Playgroud)
SparseVector是一个可序列化的类breeze.linalg.SparseVector.
这是一个简单的映射过程,所有类都是可序列化的,但是我得到了这个异常:
org.apache.spark.SparkException: Task not serializable
Run Code Online (Sandbox Code Playgroud)
但是当我删除numOfTopics参数时,即:
object DocumentParameter extends Serializable
{
def apply(document: Document) …Run Code Online (Sandbox Code Playgroud) 如果我不包含"implements Serializable"会发生什么?
public class Student implements Serializable {
private String studentNumber;
private String firstName;
private String lastName;
private ArrayList<Exam> exams;
}
Run Code Online (Sandbox Code Playgroud) 我需要为我的分布式系统类开发Java RMI应用程序.
在讲座期间,教授强调只让类实现Serializable,必须通过网络传递价值.
这意味着让太多的类实现Serializable会有一些缺点或惩罚.不需要通过网络发送的类.
我不知道如果你从未真正通过网络发送序列化/反序列化将永远不会发生任何缺点.
我注意到Oracle和PostgreSQL中都出现了以下情况.
考虑到我们有以下数据库架构:
create table post (
id int8 not null,
title varchar(255),
version int4 not null,
primary key (id));
create table post_comment (
id int8 not null,
review varchar(255),
version int4 not null,
post_id int8,
primary key (id));
alter table post_comment
add constraint FKna4y825fdc5hw8aow65ijexm0
foreign key (post_id) references post;
Run Code Online (Sandbox Code Playgroud)
有以下数据:
insert into post (title, version, id) values ('Transactions', 0, 1);
insert into post_comment (post_id, review, version, id)
values (1, 'Post comment 1', 459, 0);
insert into post_comment (post_id, review, version, …Run Code Online (Sandbox Code Playgroud) 我正在尝试实现一个任务分配系统.用户可以从池中请求任务.即使设置为SERIALIZABLE,事务有时也会向多个用户提供相同的任务,即使它不应该.
CREATE TABLE tasks(
_id CHAR(24) PRIMARY KEY,
totalInstances BIGINT NOT NULL
);
CREATE TABLE assigned(
_id CHAR(24) PRIMARY KEY,
_task CHAR(24) NOT NULL
);
Run Code Online (Sandbox Code Playgroud)
任务表中填充了许多行,假设每个行都有totalInstances = 1,这意味着每个任务最多应分配一次.
assigned:WITH task_instances AS (
SELECT t._id, t.totalInstances - COUNT(assigned._id) openInstances
FROM tasks t
LEFT JOIN assigned ON t._id = assigned._task
GROUP BY t._id, t.totalInstances
),
selected_task AS (
SELECT _id
FROM task_instances
WHERE openInstances > 0
LIMIT 1
)
INSERT INTO assigned(_id, _task)
SELECT …Run Code Online (Sandbox Code Playgroud) 好了,所以我有一个类SomeClass是Parcelable.
它有一个Parcelable名为的另一个类的数组SuperClass.在我的构造函数中SomeClass,我试图将SuperClass对象数组读入myArray实例变量中.这很简单; 然而:
SuperClass有两个子类FirstSubClass和SecondSubClass.该数组temp应该是所有3的混合,但由于某种原因它只有SuperClass对象(if和else if语句似乎没有执行,因为没有temp子类的实例的元素).
public SomeClass(Parcel in) {
myArray = new SuperClass[100];
// this is probably where the problem is due to the classloader parameter:
Object[] temp = in.readArray(SuperClass.class.getClassLoader());
for(int i = 0; i < myArray.length; i++) {
if(temp[i] instanceof FirstSubClass)
myArray[i] = (FirstSubClass) temp[i];
else if(temp[i] instanceof SecondSubClass)
myArray[i] …Run Code Online (Sandbox Code Playgroud) serializable ×10
java ×3
android ×2
c# ×2
oracle ×2
parcelable ×2
postgresql ×2
transactions ×2
.net ×1
acid ×1
apache-spark ×1
attributes ×1
concurrency ×1
generics ×1
hashmap ×1
inheritance ×1
insert ×1
marshalling ×1
rmi ×1
scala ×1
select ×1
sql ×1