Protobuf-net 没有序列化列表
Protobuf-net not serializing List
我目前正在试验 protobuf-net (v3.0.29) 并尝试 serialize/deserialize 一些简单的 classes。从最小的工作示例中,我不明白为什么 protobuf-net serializes/deserializes 简单 List<int> Value
到没有元素的列表。
public enum BigEnum { One, Two }
[ProtoContract]
public class Container
{
[ProtoMember(1)]
public BigEnum Parameter { get; private set; }
[ProtoMember(2)]
public List<int> Value { get; set; }
public Container()
{
Parameter = BigEnum.One;
Value = new List<int>();
}
}
static class Program
{
static void Main(string[] args)
{
Container data = new Container();
data.Value.Add(-1);
data.Value.Add(1);
MemoryStream memStream = new MemoryStream();
Serializer.Serialize<Container>(memStream, data);
var result = Serializer.Deserialize<Container>(memStream);
}
}
这个 protobuf 文件是由 Serializer.GetProto() 生成的,对我来说看起来不错。
我们如何正确处理 List<int> Value
并且 protobuf-net 可以处理更复杂的结构,例如
List<KeyValuePair<String, String>>
或 Dictionary<int,double>
在 class 内?
protobuf-net 有一些非常古老的帖子,周围有字典,但我不知道当前状态如何。
syntax = "proto3";
package NetCoreProtobuf;
enum BigEnum {
One = 0;
Two = 1;
}
message Container {
BigEnum Parameter = 1;
repeated int32 Value = 2 [packed = false];
}
非常简单:您没有倒回流,所以它从 当前 位置读取 - 在流的末尾,要读取零字节。碰巧零字节在 protobuf 中是完全有效,所以它不能真正引发
这里有例外,因为您在反序列化零字节时可能是完全正确的。
Serializer.Serialize<Container>(memStream, data);
memStream.Position = 0;
var result = Serializer.Deserialize<Container>(memStream);
或者更简单:使用DeepClone
方法:
var clone = Serializer.DeepClone(data);
我目前正在试验 protobuf-net (v3.0.29) 并尝试 serialize/deserialize 一些简单的 classes。从最小的工作示例中,我不明白为什么 protobuf-net serializes/deserializes 简单 List<int> Value
到没有元素的列表。
public enum BigEnum { One, Two }
[ProtoContract]
public class Container
{
[ProtoMember(1)]
public BigEnum Parameter { get; private set; }
[ProtoMember(2)]
public List<int> Value { get; set; }
public Container()
{
Parameter = BigEnum.One;
Value = new List<int>();
}
}
static class Program
{
static void Main(string[] args)
{
Container data = new Container();
data.Value.Add(-1);
data.Value.Add(1);
MemoryStream memStream = new MemoryStream();
Serializer.Serialize<Container>(memStream, data);
var result = Serializer.Deserialize<Container>(memStream);
}
}
这个 protobuf 文件是由 Serializer.GetProto() 生成的,对我来说看起来不错。
我们如何正确处理 List<int> Value
并且 protobuf-net 可以处理更复杂的结构,例如
List<KeyValuePair<String, String>>
或 Dictionary<int,double>
在 class 内?
protobuf-net 有一些非常古老的帖子,周围有字典,但我不知道当前状态如何。
syntax = "proto3";
package NetCoreProtobuf;
enum BigEnum {
One = 0;
Two = 1;
}
message Container {
BigEnum Parameter = 1;
repeated int32 Value = 2 [packed = false];
}
非常简单:您没有倒回流,所以它从 当前 位置读取 - 在流的末尾,要读取零字节。碰巧零字节在 protobuf 中是完全有效,所以它不能真正引发 这里有例外,因为您在反序列化零字节时可能是完全正确的。
Serializer.Serialize<Container>(memStream, data);
memStream.Position = 0;
var result = Serializer.Deserialize<Container>(memStream);
或者更简单:使用DeepClone
方法:
var clone = Serializer.DeepClone(data);