7

症状:没有为类型定义序列化程序: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;}

然后将成为转换为包装器列表和从包装器列表转换的一种。有没有更简单的前进方式?

4

2 回答 2

13

protobuf-net 真的很想了解您正在序列化的数据;拥有 是不够的Array,因为它不能映射到任何 protobuf 定义。重复数据(从概念上讲,数组)在 protobuf 规范中具有非常简洁和非常具体的表示,这不允许在个人基础上说“[x]”的额外空间。在 protobuf 中,"of [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 挤入的垫片)。

于 2012-05-09T06:12:42.363 回答
-1

你为什么不尝试像这样创建一个新的 ISerializable 对象

[Serializable()]    
public class ArrayOfInt : ISerializable 
{
    public Array ....etc

并从接口 ISerializable 覆盖 GetObjectData()

于 2012-05-09T06:12:25.063 回答