0

私のwcfサービスで次のメソッドを呼び出しています....

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

次の例外が発生します…</p>

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)

注: 2 番目と 3 番目のパラメーターを削除した場合。その方法は…</p>

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);
}
4

2 に答える 2

1

Enum、int、double、string などは、それ自体では有効なプロトコル バッファ メッセージではありません。それらをオブジェクトのフィールドまたはプロパティにしてから、そのオブジェクトをシリアル化する必要があります。

于 2013-02-28T22:14:13.157 に答える
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;}

}
于 2013-02-28T23:06:56.590 に答える