【发布时间】: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