【问题标题】:Serializing an Array in WCF with protobuf-net使用 protobuf-net 序列化 WCF 中的数组
【发布时间】:2014-03-19 14:40:47
【问题描述】:

我正在尝试使用 protobuf-net 通过 WCF 序列化我的数据对象数组。

如果我手动序列化我的数据对象的数组,它会成功:

var proto = Serializer.CreateFormatter<DataType[]>();

这比普通的二进制 xml DataContractSerializer 更快更小 - 这就是我想使用它的原因!

“DataType”类只是一个例子——我有很多这样的例子。当我的服务响应只是一个对象时,一切正常。

但是当我的服务返回一个对象数组时,它似乎不知道该做什么并使用普通的DataContractSerializer

应用了 ProtoBehavior:

endpoint.Behaviors.Add(new ProtoBuf.ServiceModel.ProtoEndpointBehavior());

我的数据对象或多或少是这样的:

[Serializable]
[DataContract]
[ProtoContract]
public class DataType
{
    [DataMember(EmitDefaultValue = false, Name = "K")]
    [ProtoMember(1)]
    public string Key { get; set; }

    // many more to come
}

这基本上就是我的服务:

[ServiceContract(CallbackContract = typeof(IBaseDataObjectUpdate), SessionMode = SessionMode.Required)]
[ServiceKnownType("GetKnownTypes", typeof(KnownTypesProvider))]
public interface IDataTypeService
{
    [OperationContract]
    DataType[] Load(Filter[] filter, Guid clientGuid);

    // some more
}

我可以追踪到XmlProtoSerializer 中的TryCreate。来电:

int key = GetKey(model, ref type, out isList);

没有返回有效的密钥,因此没有创建XmlProtoSerializer

这解释了这种行为,但我在这里有什么选择?

我找到了 Marc Gravell 的一个旧答案,他建议创建一个由数组组成的对象。但从 2011 年开始,它可能已经过时了: https://stackoverflow.com/a/6270267/2243584

或者我可以手动将模型添加到 protobuf-net 吗?如上所述,手动序列化正在运行。

欢迎评论!

【问题讨论】:

    标签: c# arrays wcf serialization protobuf-net


    【解决方案1】:

    好的,到目前为止我已经想出了2个解决方案。

    1. 不要使用数组!它适用于任何其他集合。这促使我进行调查并找到了解决方案:
    2. 在 protobuf-net 中支持数组

    我对TypeMode类中的internal static Type GetListItemType(TypeModel model, Type listType)方法做了如下调整:

    if (listType.IsArray)  // NEW
    {
      if (listType.GetElementType() == typeof(byte))
        return null;
    }
    if (listType == model.MapType(typeof(string)) // || listType.IsArray // CHANGED!!!
      || !model.MapType(typeof(IEnumerable)).IsAssignableFrom(listType)) return null;
    

    我想我确实弄清楚了为什么要排除数组。因为如果您支持 byte[],那么在最终将数据发送到线路时会遇到一些问题。至少我在处理 byte[] 时在编码工厂中得到了一些 Assert 和异常。

    因为我不知道解决方案 Nr 的副作用。 2 - 我坚持解决方案 Nr。 1.

    尽管如此,我还是非常希望 Marc 发表评论 - 当然,欢迎大家!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多