gpt4 book ai didi

c# - 如何序列化数组?

转载 作者:太空狗 更新时间:2023-10-29 22:33:37 26 4
gpt4 key购买 nike

症状:没有为类型定义序列化器:System.Array

由于所有 C# 数组都继承自 Array 类,我认为这在 ProtoBuf-net 中是有效的

[ProtoMember(1)]
public Array SomeKindOfArray = new int[]{1,2,3,4,5};

[ProtoMember(2)]
public List<Array> SomeKindOfList = new List<Array>();

我应该向 RuntimeTypeModel 注册 Array 吗?

m.Add(typeof (Array), true);  // does not seem to help

尝试:

new int[]{1,2,3,4} // works

(object)new int[] { 1, 2, 3, 4 } // does not work

(Array)new int[] { 1, 2, 3, 4 } // does not work

另一个可能的解决方案(现在找不到 SO url):

有一个基类型类项的列表。

包装每种类型。例如

class TheBase{}

class ArrayOfInt { public int[] value;}

这将成为与包装器列表之间的转换之一。有更简单的方法吗?

最佳答案

protobuf-net 真的很想了解你正在序列化的数据;仅有 Array 是不够的,因为它无法映射到任何 protobuf 定义。重复数据(概念上,数组)在 protobuf 规范中有非常简洁和非常具体的表示,它不允许额外的空间来单独说“[x]”。在 protobuf 中,“[x]”应该是已知的并且提前固定。

所以:

[ProtoMember(1)]
public int[] AnIntegerArray {get;set;}

[ProtoMember(2)]
public Customer[] ACustomerArray {get;set;}

将正常工作。但是 Array 根本不起作用。

根据这有多重要,可能还有其他选项,例如(您可能想调整名称!):

[ProtoContract]
[ProtoInclude(1, typeof(DummyWrapper<int>)]
[ProtoInclude(2, typeof(DummyWrapper<Customer>)]
public abstract class DummyWrapper {
public abstract Type ElementType {get;}
}
[ProtoContract]
public class DummyWrapper<T> : DummyWrapper {
[ProtoMember(1)]
public T[] TheData {get;set;}

public override Type ElementType {get { return typeof(T); } }
}

与:

[ProtoMember(1)]
public DummyWrapper TheData {get;set;}

会工作,我怀疑(未经测试)。对于类,protobuf-net 可以使用一些额外的空间来实现继承(从技术上讲,protobuf 规范也不支持它——这是 protobuf-net 挤进去的垫片)。

关于c# - 如何序列化数组?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10510589/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com