- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我使用 protostuff-runtime 来序列化对象图。其中一些对象引用了 Guava 不可变集合,例如 ImmutableList 和 ImmutableSet。 Protostuff 无法开箱即用地反序列化这些集合,因为它尝试构造一个实例,然后从 inputStream 向其“添加”元素(这会失败,因为集合是不可变的)。
您知道有任何库/原型(prototype)插件可以开箱即用吗?如果没有,是否有自己执行此操作的最佳实践?
我调查过,发现protostuff有一个"delegate"的概念,这使您可以控制特定类型的序列化。这似乎是我问题的答案,但我似乎无法让它发挥作用。
这是我现在拥有的:
import com.dyuproject.protostuff.Schema;
import com.dyuproject.protostuff.runtime.RuntimeSchema;
import com.google.common.base.Preconditions;
import com.google.common.collect.ImmutableList;
import javax.annotation.Nonnull;
import javax.annotation.concurrent.Immutable;
/**
* This is the POJO I want to serialize. Note that the {@code strings} field refers to an {@link ImmutableList}.
*/
@Immutable
public class Foo {
public static final Schema<Foo> SCHEMA = RuntimeSchema.getSchema(Foo.class);
@Nonnull
private final ImmutableList<String> strings;
public Foo(ImmutableList<String> strings) {
this.strings = Preconditions.checkNotNull(strings);
}
@Nonnull
public ImmutableList<String> getStrings() {
return strings;
}
@Override
public boolean equals(Object obj) {
if (obj instanceof Foo) {
Foo that = (Foo) obj;
return this.strings.equals(that.strings);
}
return false;
}
@Override
public int hashCode() {
return strings.hashCode();
}
}
<小时/>
import com.dyuproject.protostuff.*;
import com.dyuproject.protostuff.runtime.Delegate;
import com.dyuproject.protostuff.runtime.RuntimeSchema;
import com.google.common.collect.ImmutableList;
import com.google.common.collect.Lists;
import java.io.IOException;
import java.util.ArrayList;
public class ImmutableListDelegate implements Delegate<ImmutableList<?>> {
private static final Schema<ArrayList> LIST_SCHEMA = RuntimeSchema.getSchema(ArrayList.class);
@Override
public WireFormat.FieldType getFieldType() {
return WireFormat.FieldType.MESSAGE;
}
@Override
public ImmutableList<?> readFrom(Input input) throws IOException {
ArrayList<?> list = LIST_SCHEMA.newMessage();
input.mergeObject(list, LIST_SCHEMA);
return ImmutableList.copyOf(list);
}
@Override
public void writeTo(Output output, int number, ImmutableList<?> value, boolean repeated) throws IOException {
ArrayList<?> list = Lists.newArrayList(value);
output.writeObject(number, list, LIST_SCHEMA, repeated);
LIST_SCHEMA.writeTo(output, list);
}
@Override
public void transfer(Pipe pipe, Input input, Output output, int number, boolean repeated) throws IOException {
throw new UnsupportedOperationException("TODO");
}
@Override
public Class<?> typeClass() {
return ImmutableList.class;
}
}
<小时/>
import com.dyuproject.protostuff.LinkedBuffer;
import com.dyuproject.protostuff.ProtostuffIOUtil;
import com.dyuproject.protostuff.runtime.DefaultIdStrategy;
import com.dyuproject.protostuff.runtime.RuntimeEnv;
import com.google.common.collect.ImmutableList;
import org.junit.Assert;
import org.junit.Before;
import org.junit.Test;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
public class ImmutableListDelegateTest {
@Before
public void before() {
// registers the delegate
if (RuntimeEnv.ID_STRATEGY instanceof DefaultIdStrategy) {
((DefaultIdStrategy) RuntimeEnv.ID_STRATEGY).registerDelegate(new ImmutableListDelegate());
}
}
@Test
public void testDelegate() throws IOException {
Foo foo = new Foo(ImmutableList.of("foo"));
Assert.assertEquals(foo, serializeThenDeserialize(foo));
}
private Foo serializeThenDeserialize(Foo fooToSerialize) throws IOException {
ByteArrayOutputStream out = new ByteArrayOutputStream();
ProtostuffIOUtil.writeDelimitedTo(out, fooToSerialize, Foo.SCHEMA, buffer());
ByteArrayInputStream in = new ByteArrayInputStream(out.toByteArray());
Foo fooDeserialized = Foo.SCHEMA.newMessage();
ProtostuffIOUtil.mergeDelimitedFrom(in, fooDeserialized, Foo.SCHEMA, buffer());
return fooDeserialized;
}
private LinkedBuffer buffer() {
return LinkedBuffer.allocate(LinkedBuffer.DEFAULT_BUFFER_SIZE);
}
}
测试失败并出现以下异常,这似乎意味着我的委托(delegate)仅反序列化空值:
java.lang.NullPointerException
at com.google.common.base.Preconditions.checkNotNull(Preconditions.java:191)
at com.google.common.collect.SingletonImmutableList.<init>(SingletonImmutableList.java:40)
at com.google.common.collect.ImmutableList.asImmutableList(ImmutableList.java:305)
at com.google.common.collect.ImmutableList.copyFromCollection(ImmutableList.java:314)
at com.google.common.collect.ImmutableList.copyOf(ImmutableList.java:253)
at test.ImmutableListDelegate.readFrom(ImmutableListDelegate.java:25)
at test.ImmutableListDelegate.readFrom(ImmutableListDelegate.java:12)
at com.dyuproject.protostuff.runtime.RuntimeUnsafeFieldFactory$19$1.mergeFrom(RuntimeUnsafeFieldFactory.java:1111)
at com.dyuproject.protostuff.runtime.MappedSchema.mergeFrom(MappedSchema.java:188)
at com.dyuproject.protostuff.IOUtil.mergeDelimitedFrom(IOUtil.java:109)
at com.dyuproject.protostuff.ProtostuffIOUtil.mergeDelimitedFrom(ProtostuffIOUtil.java:151)
at test.ImmutableListDelegateTest.serializeThenDeserialize(ImmutableListDelegateTest.java:38)
at test.ImmutableListDelegateTest.testDelegate(ImmutableListDelegateTest.java:30)
这是正确的方法吗?我错过了什么?
这不是 What is a Null Pointer Exception, and how do I fix it? 的重复项问题,这毫无意义。我提到在尝试使用 Protostuff 委托(delegate)来反序列化不可变集合时会抛出 NPE,这一事实并不意味着这会重复“什么是 NPE?”以任何方式、形状或形式提出问题。
最佳答案
一切看起来都很好
java.lang.NullPointerException
at com.google.common.base.Preconditions.checkNotNull(Preconditions.java:191)
at com.google.common.collect.SingletonImmutableList.<init>(SingletonImmutableList.java:40)
表示您正在尝试将 null
放入 ImmutableList
中,这是禁止的。可以肯定的是,请检查失败行之前的list
。确保您的输入 json 看起来不像 [null]
。
关于java - 如何使用 Protostuff 序列化 Guava 的不可变集合?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12352559/
本文整理了Java中io.protostuff.WireFormat类的一些代码示例,展示了WireFormat类的具体用法。这些代码示例主要来源于Github/Stackoverflow/Maven
本文整理了Java中io.protostuff.YamlIOUtil类的一些代码示例,展示了YamlIOUtil类的具体用法。这些代码示例主要来源于Github/Stackoverflow/Maven
我有一个 Java 类层次结构,我想使用 protostuff 对其进行序列化和反序列化。 这些类如下(只是一个玩具示例) class Wrapper { public List beings
本文整理了Java中com.dyuproject.protostuff.YamlOutput类的一些代码示例,展示了YamlOutput类的具体用法。这些代码示例主要来源于Github/Stackov
我正在研究一个类的不同版本(来自序列化二进制表示)之间的向后兼容性框架。 我坚持的一件事是如何在运行时用字段类的不同版本替换类中使用的字段。 如果所讨论的类是父对象 (Java - how to lo
我正在尝试使用protostuff来序列化反序列化json,但是当我序列化对象时,数组的大小放在前面 {"id":1,"price":1.2,"name":"alex","tags":{"a":3,"
让 protostuff 表现得像标准 Jackson 序列化器一样的最简单方法是什么? 我希望能够将对象图、列表或数组序列化为根对象,但似乎甚至没有解决方法? 这里 - o 是对象,可以是 Stri
我正在使用带有循环引用和泛型的 protostuff 二进制文件。作为一个非常简单的场景,我有以下类: public class A { private String name;
本文整理了Java中io.protostuff.WireFormat.makeTag()方法的一些代码示例,展示了WireFormat.makeTag()的具体用法。这些代码示例主要来源于Github
本文整理了Java中io.protostuff.WireFormat.getTagWireType()方法的一些代码示例,展示了WireFormat.getTagWireType()的具体用法。这些代
本文整理了Java中io.protostuff.WireFormat.getTagFieldNumber()方法的一些代码示例,展示了WireFormat.getTagFieldNumber()的具体
本文整理了Java中io.protostuff.YamlIOUtil.writeTo()方法的一些代码示例,展示了YamlIOUtil.writeTo()的具体用法。这些代码示例主要来源于Github
Protostuff 代码生成器生成的类是否与 Protobuf 创建的类兼容? 我尝试(反)序列化一些简单的消息并得到几个异常: 原型(prototype)文件 (WrapperClass.prot
本文整理了Java中com.dyuproject.protostuff.YamlOutput.()方法的一些代码示例,展示了YamlOutput.()的具体用法。这些代码示例主要来源于Github/S
本文整理了Java中com.dyuproject.protostuff.YamlOutput.writeTag()方法的一些代码示例,展示了YamlOutput.writeTag()的具体用法。这些代
我正在尝试学习如何使用 Protostuff。我有一个使用 protostuff 1.0.7 的示例。在此示例中使用了 RuntimeSchema 类。 当我尝试使用当前版本的 protostuff
我使用 protostuff-runtime 来序列化对象图。其中一些对象引用了 Guava 不可变集合,例如 ImmutableList 和 ImmutableSet。 Protostuff 无法开
由于 protostuff-maven-plugin 在 Mac 上正常工作时未生成正确的输出路径,因此我收到错误“文件名、目录名或卷标语法不正确”。详情如下: 由以下原因引起的错误:java.io.
我以最基本的方式使用 Protostuff RuntimeSchema : Schema schema = RuntimeSchema.createFrom(Bean.class); 我会将结果 by
我正在 Windows 系统和 Android 设备上基于 .Net 的程序之间进行通信。在 .Net 端,我使用 Marc Gravell 出色的 protobuf-net 程序,在 Android
我是一名优秀的程序员,十分优秀!