我们想知道当使用Bundle可序列化或可分割的对象时,编组何时实际发生?一旦你把它放在捆绑中?由于bundle主要用于简单地在两个屏幕之间传递数据(我们在这里甚至不讨论IPC!),编组对象似乎没什么意义,因为它始终保留在内存中,没有?
我们是否正确地假设编组(无论是Java序列化还是Android分区)只会发生
我见过Android框架工程师(我相信是Dianne Hackborn)说应该使用Parcelable而不是Serializable因为前者更快.多快了?如果对象在大多数情况下都没有编组,那么这是否会产生影响(假设我们对此的假设是正确的)?
我试图序列化具有嵌套类的对象.我用[NonSerialized]属性标记了嵌套类,但是收到错误:
属性"NonSerialized"在此声明类型上无效.它仅对"字段"声明有效.
如何从序列化中省略嵌套类?
我已经包含了一些可能显示我想要做的代码.谢谢你的帮助.
[Serializable]
public class A_Class
{
public String text { get; set; }
public int number { get; set; }
}
[Serializable]
public class B_Class
{
[NonSerialized]
public A_Class A { get; set; }
public int ID { get; set; }
}
public byte[] ObjectToByteArray(object _Object)
{
using (var stream = new MemoryStream())
{
var formatter = new BinaryFormatter();
formatter.Serialize(stream, _Object);
return stream.ToArray();
}
}
void Main()
{
Class_B obj = new Class_B()
byte[] data = ObjectToByteArray(obj); …Run Code Online (Sandbox Code Playgroud) 有没有可行的原因,为什么serialVersionUID字段没有命名为SERIAL_VERSION_UID?
根据java.io.Serializable的文档:
可序列化类可以通过声明名为"serialVersionUID"的字段来显式声明其自己的serialVersionUID,该字段必须是static,final和long类型:
ANY-ACCESS-MODIFIER静态最终长serialVersionUID = 42L;
在引用Java命名约定时,所有静态最终(常量)字段都应该被限制,其片段用下划线分隔.
我正在使用LINQPad来测试代码(我必须说,这是一个很棒的产品),但是当我尝试将Thread.CurrentPrincipal设置为一个自定义的IPrincipal时,我遇到了一个异常,该自定义的IPrincipal在示例中跟随了一个示例的SerializableAttribute问题
void Main()
{
Thread.CurrentPrincipal = new MyCustomPrincipal();
}
// Define other methods and classes here
[Serializable]
public class MyCustomPrincipal : IPrincipal
{
public bool IsInRole(string role)
{
return true;
}
public IIdentity Identity
{
get
{
return new WindowsIdentity("RECUPERA\\m.casamento");
}
}
}
Run Code Online (Sandbox Code Playgroud)
当我在LINQPad(C#Program as Language)中运行此代码时,我得到以下异常
Type is not resolved for member 'UserQuery+MyCustomPrincipal,query_nhxfev, Version=0.0.0.0,
Culture=neutral, PublicKeyToken=null'
RuntimeMethodInfo: PluginWindowManager.get_Form ()
Run Code Online (Sandbox Code Playgroud)
如果我删除Serializable属性一切正常.这似乎是与LINQPad使用的AppDomain体系结构相关的问题,以及框架无法找到定义MyCustomPrincipal的程序集.此外,我相信将MyCustomPrincipal定义到另一个程序集并将其放入GAC可以解决问题,但这对我来说不是一个选择.有人有想法吗?
谢谢,马可
编辑:我不知道它是否可以帮助,但我遇到了与SqlDependency.Start相同的问题:将Serializable放在IPrincipal上使得框架抛出一个错误,抱怨它无法找到定义类型的程序集IPrincipal的.我用一个可耻的黑客解决了:
System.Security.Principal.IPrincipal principal;
principal = System.Threading.Thread.CurrentPrincipal;
System.Threading.Thread.CurrentPrincipal = null;
try
{
SqlDependency.Start(connectionString);
m_SqlDependencyStarted = true;
}
catch (Exception …Run Code Online (Sandbox Code Playgroud) 我已经实现了onRestoreInstanceState和onSaveInstanceState.当应用程序最小化时(通过按主页按钮,或其他活动位于前台),它们都能成功运行.但是,当我最小化应用程序并终止进程时(通过打开当前进程列表并结束该进程),应用程序不会还原已保存的实例状态.如何让它恢复保存的状态?我是使用serializable将savedInstanceState包写入文件的最佳选择(因此将某些内容存储在硬盘驱动器上,而不是RAM中),然后从文件中重新加载savedInstanceState?
从问题为什么Java有瞬态字段?.我能够理解瞬态.但是,在设计时无法评估使用transient关键字.
public class A implements Serializable
{
public String s;
public transient ts;
}
Run Code Online (Sandbox Code Playgroud)
如果我以另一种方式做同样的事情..
public class A implements Serializable
{
public String s;
//public transient ts;//removing this variable.
}
Run Code Online (Sandbox Code Playgroud)
并在类中使用另一个类和define方法并定义变量ts并执行操作并将s的值保存为业务定义.
题
我没有在网上找到任何实时的例子,我将决定定义一个变量transient.
我怎么能在设计时决定定义瞬态?有没有可以帮助我理解的实时场景?
我正在尝试使用Java 8 lambdas并且有关于对象序列化的一般问题.例如,如果executor.execute只有一个方法并且在没有序列化的情况下运行代码块,则以下输入将打印5.但是,如果我通过SerializedLambda序列化lambda表达式并将其反序列化,则它会打印null,因为它在此新的反序列化对象中没有前一个上下文.此外,它编译没有任何投诉,因为第一个上下文解决了外部变量.(本例中为finalVar):
final int finalVar = 5;
executor.execute(() -> {
System.out.println(finalVar);
});
Run Code Online (Sandbox Code Playgroud)
我想知道是否有可能告诉SerializedLambda将finalVar包含到序列化输出中,而不实现具有finalVar变量字段的接口,并在构造时将其值设置为字段.AFAIK,这是用Java做这种事情最干净的方法:
final int finalVar = 5;
executor.execute(new Runnable() {
int myVar = finalVar;
public void run() {
System.out.println(myVar);
}
);
Run Code Online (Sandbox Code Playgroud)
我甚至不确定这一点,但我认为编译器可以找出外部变量,并在我尝试序列化该lambda时序列化并包含它们.有没有什么技巧可以让Java做这样的事情,还是有任何语言有这样的功能?
我注意到存储在Redis中的一些序列化对象在反序列化方面存在问题.
当我对存储在Redis中的对象类进行更改时,通常会发生这种情况.
我想了解这个问题,以便为解决方案设计一个清晰的设计.
我的问题是,导致反序列化问题的原因是什么?拆除公共/私人财产会导致问题吗?或许可以添加新属性?为类添加新函数会产生问题吗?更多的构造函数呢?
在我的序列化对象中,我有一个属性Map,如果我更改(更新了一些属性,添加了函数等)myObject,它会导致反序列化问题吗?
serializable redis deserialization spring-data spring-data-redis
HashMap与Serializable键/值应该是Serializable.
但这对我不起作用.尝试了一些其他IO流.没有用.
有什么建议吗?
测试代码
public class SimpleSerializationTest {
@Test
public void testHashMap() throws Exception {
HashMap<String, String> hmap = new HashMap<String, String>() {{
put(new String("key"), new String("value"));
}};
ByteArrayOutputStream bos = new ByteArrayOutputStream();
ObjectOutput out = null;
out = new ObjectOutputStream(bos);
out.writeObject(hmap);
byte[] yourBytes = bos.toByteArray();
if (out != null) {
out.close();
}
bos.close();
ByteArrayInputStream bis = new ByteArrayInputStream(yourBytes);
ObjectInput in = null;
in = new ObjectInputStream(bis);
Object o = in.readObject();
bis.close();
if (in != …Run Code Online (Sandbox Code Playgroud) 我发现人们在回答线性化和可分割性之间存在差异,但我发现人们都没有发现可串行化与顺序一致性相同或者与之不同.
此外,我在不同的文章,书籍和网页上对上述术语的不同定义进行了抨击,我对此感到困惑.有人可以解释可串行性和顺序一致性之间的区别是否存在.
如果可能的话,我将赞赏上述术语的正式定义(无论是简单的英语还是程序或执行历史).
serializable ×10
java ×4
android ×2
c# ×2
.net ×1
bundle ×1
consistency ×1
hashmap ×1
iprincipal ×1
linqpad ×1
marshalling ×1
parcelable ×1
redis ×1
reload ×1
savestate ×1
scala ×1
spring-data ×1
transient ×1