在我的wcf服务上调用以下方法…。

ObservableCollection<PatientViewModel> Search(List<string> searchTerms, SearchNature nature, SearchMode mode, List<SearchField> fields)

导致以下异常…

ProtoBuf.ProtoException, protobuf-net, Version=2.0.0.627, Culture=neutral, PublicKeyToken=75e2634e27c46854

Invalid wire-type; this usually means you have over-written a file without truncating or setting the length; see http://stackoverflow.com/q/2152978/23354

ProtoBuf.ProtoReader.ReadInt32()
proto_4(Object , ProtoReader )
ProtoBuf.ServiceModel.XmlProtoSerializer.ReadObject(XmlDictionaryReader reader, Boolean verifyObjectName)
System.ServiceModel.Dispatcher.DataContractSerializerOperationFormatter.PartInfo.ReadObject(XmlDictionaryReader reader, XmlObjectSerializer serializer)
System.ServiceModel.Dispatcher.DataContractSerializerOperationFormatter.DeserializeParameterPart(XmlDictionaryReader reader, PartInfo part, Boolean isRequest)
System.ServiceModel.Dispatcher.DataContractSerializerOperationFormatter.DeserializeParameters(XmlDictionaryReader reader, PartInfo[] parts, Object[] parameters, Boolean isRequest)
System.ServiceModel.Dispatcher.DataContractSerializerOperationFormatter.DeserializeBody(XmlDictionaryReader reader, MessageVersion version, String action, MessageDescription messageDescription, Object[] parameters, Boolean isRequest)
System.ServiceModel.Dispatcher.OperationFormatter.DeserializeBodyContents(Message message, Object[] parameters, Boolean isRequest)
System.ServiceModel.Dispatcher.OperationFormatter.DeserializeRequest(Message message, Object[] parameters)
System.ServiceModel.Dispatcher.DispatchOperationRuntime.DeserializeInputs(MessageRpc&amp; rpc)
System.ServiceModel.Dispatcher.DispatchOperationRuntime.InvokeBegin(MessageRpc&amp; rpc)
System.ServiceModel.Dispatcher.ImmutableDispatchRuntime.ProcessMessage5(MessageRpc&amp; rpc)
System.ServiceModel.Dispatcher.ImmutableDispatchRuntime.ProcessMessage31(MessageRpc&amp; rpc)
System.ServiceModel.Dispatcher.MessageRpc.Process(Boolean isOperationContextSet)

注意:如果我删除第二个和第三个参数。 所以方法是

ObservableCollection<PatientViewModel> Search(List<string> searchTerms, List<SearchField> fields)

这很好。

参数字段是一个枚举列表,并且反序列化没有问题。

为什么单个枚举值会导致上述异常?

提前致谢。

供你参考...

[DataContract]
public enum SearchNature
{
    [EnumMember] None,
    [EnumMember] Letters,
    [EnumMember] Numbers
}

[DataContract]
public enum SearchMode
{
    [EnumMember] None,
    [EnumMember] BeginsWith,
    [EnumMember] Contains
}

[DataContract]
public enum SearchField
{
    [EnumMember] None,
    [EnumMember] FirstName,
    [EnumMember] LastName,
    [EnumMember] PatientId,
    [EnumMember] PriorId,
    [EnumMember] PhoneNumber,
    [EnumMember] DateOfBirth
}

编辑:

另外,如果当类型是枚举而不是XmlProtoSerializer时,如果我更改ProtoOperationBehavior以使用默认的序列化程序,则该服务调用会正常工作。

public override XmlObjectSerializer CreateSerializer(Type type, System.Xml.XmlDictionaryString name, System.Xml.XmlDictionaryString ns, IList<Type> knownTypes)
{
    if (type.IsEnum) return base.CreateSerializer(type, name, ns, knownTypes);
    if (model == null) throw new InvalidOperationException("No Model instance has been assigned to the ProtoOperationBehavior");
    return XmlProtoSerializer.TryCreate(model, type) ?? base.CreateSerializer(type, name, ns, knownTypes);
}

===============>>#1 票数:1

枚举,整数,双精度,字符串等本身都不是有效的协议缓冲区消息。 您必须使它们成为对象的字段或属性,然后序列化该对象。

===============>>#2 票数:0

如果您要上一堂课并将其传递到搜索中,那么您应该会得到所需的内容。 希望这会有所帮助。

如果您随后有了序列化器,它将带给您可操作的类对象。

[ProtoContract()]
public class PatientSearch
{
    public PatientSearch()
    {
        searchTerms = new List<string>();
        fields = new List<SearchField>();
    }
    [ProtoMember(1)]
    public List<string>searchTerms {get;private set;}

    [ProtoMember(2)]
    public SearchNature Nature {get; set;}
    [ProtoMember(3)]
    public SearchMode Nature {get; set;}
    [ProtoMember(4)]
    public  List<SearchField> fields {get; private set;}

}

  ask by Brian Singh translate from so

未解决问题?本站智能推荐:

1回复

protobuf -net不知道如何序列化type = object的datamember

我们将以下类作为使用WCF在线路上运行的ADO.NET提供程序的一部分。 我们正在尝试使用protobuf-net进行序列化,但是抛出的异常是无法解析类型对象。 例外消息: 堆栈跟踪: 有可能解决这个问题吗? 编辑:我们有一个基本上做的自定义例程(简化为简洁)
1回复

ProtoBuf WCF“尚未分配模型实例”

我收到此错误: 尚未将任何Model实例分配给ProtoOperationBehavior 我只是在Visual Studio中使用WCF模板应用程序来查看是否可以运行它。 如何解决此错误? 码 app.config:
1回复

将protobuf-net添加到我的WCF Rest服务

是否有任何规范的直接方式在.NET 4 WCF上启用protobuf-net序列化? 我试图将代码简化到可以轻松构建的程度: 这是我的服务代码: 我在Application_OnStart (Global.asax)中激活此服务路由,如下所示: 我使用MyServiceH
1回复

Protobuf-net如何在NET CF客户端中使用WCF服务?

我正在尝试使用Protobuf-net的RPC功能使用WCF Web服务。 这是我的服务合同: 下面是我的.NET CF客户端: EchoServiceClient类:ProtoClient,IEchoService { 这就是我尝试使用Web服务的方式: 我不断
2回复

为什么我的WCF服务器使用protobuf-net返回空响应?

我已经更新了现有的WCF应用程序以添加protobuf-net支持。 基本上,我已经: 在包含我所有数据对象的程序集中添加了protobuf-net.dll(.net 3.0)作为引用。 我的服务器和客户端都引用了该程序集 将[DataMember]替换为[DataMemb
1回复

我可以将net.tcp绑定用于protobuf-net WCF吗?

我可以将net.tcp绑定用于protobuf-net WCF吗? 我可以使用ClientBase还是必须使用ProtoClient?
2回复

Protobuf-net和.proto文件?

我将在WCF服务中使用protobuf-net库。 客户端是Java-Android,我在那边使用proto文件。 我应该在.NET端还是protobuf-net上手动编码类,以某种方式支持.proto文件?
1回复

protobuf-net WCF多个嵌套的通用抽象对象序列化v282

这是我在这里的第一篇文章,所以请忍受... 我试图嵌套多个通用对象,然后使用ProtoBuf-net通过WCF传递它们。 我实现了许多(10+)个主要对象,列出的代码仅显示2。它们都具有相似的结构,但是也有一些仅使用一种或两种泛型(因此它们的继承结构) 处理完所有标签和ProtoI
1回复

Protobuf-net未序列化基类成员

我们有以下类和WCF服务(使用protobuf-net进行序列化): 我们有两个问题: 在序列化期间,我们得到一个例外,即ScheduleTemplateViewModel的Castle DynamicProxy类型是意外的。 我们注意到在protobuf-net中有自定义代
1回复

使用protobuf-net序列化基类属性

在实体模型中,我们的类层次结构有些复杂。 我们为所有实体提供一个基类BaseEntity ,然后是从BaseEntity派生的一些“级别2”类,从任何“级别2”类派生的一些“级别3”类,以及从任何“实体”派生的很多“级别4”类。 3级课程。 那意味着,我们有这样的事情: 基础实体