ProtoBufはインターフェースでオブジェクトを逆シリアル化しません

MJ-

TCPソケットがあり、ProtoBufを使用してオブジェクトを送受信したいと思います。しかし、私はこのエラーを受け取ります:

スローされた例外:protobuf-net.dllの「System.InvalidOperationException」

タイプは予期されておらず、コントラクトを推測することはできません:Server.Packet.IMsg

私のインターフェース:

 public interface IMsg { }

送受信したいオブジェクトの1つ:

[ProtoContract]
public class PacketPerson : IMsg
{
    [ProtoMember(1)]
    public string Name{ get; set; }
    [ProtoMember(2)]
    public string Country { get; set; }
}

バッファがいっぱいになった後、ソケットが逆シリアル化しようとしています。

 IMsg msg = Serialization.Desirialize(SocketMemoryStream);

望ましい:

    public static IMsg Desirialize(MemoryStream ms) // socket buffer
    {
        ms.Position = 0;
        return Serializer.Deserialize<IMsg>(ms);
    }
マーク・グラヴェル

はい。ただし、マルチオブジェクトを送信し、「Type type = packet.GetType();」を使用してそれらを識別したいと思います。次に、Ifステートメント「if(type == typeof(PacketPerson))」を使用します

私の提案(著者として話す):


[ProtoContract]
[ProtoInclude(1, typeof(PacketPerson))]
// future additional message types go here
class SomeMessageBase {}

[ProtoContract]
class PacketPerson : SomeMessageBase
{
    [ProtoMember(1)]
    public string Name{ get; set; }
    [ProtoMember(2)]
    public string Country { get; set; }
}

および逆シリアル化/シリアル化<SomeMessageBase>ライブラリは、ここですべての継承を正しい方法で処理します。舞台裏では、これは(.proto用語で)同様に実装されます:

message SomeMessageBase {
    oneof ActualType {
        PacketPerson = 1;
        // ...
    }
}
message PacketPerson {
    string Name = 1;
    string Country = 2;
}

実行時に実際の型を決定するために、ポリモーフィズムまたは型テストのいずれかを使用できるようになりました。新しいswitch構文は特に便利です。

SomeMessageBase obj = WhateverDeserialize();
switch(obj)
{
    case PacketPerson pp:
        // do something person-specific with pp
        break;
    case ...:
        // etc
        break;
}

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

分類Dev

Serializableインターフェイスを実装しましたが、クラスオブジェクトはまだシリアル化できません

分類Dev

PHP:\ Serializableインターフェースを実装するようになったphpオブジェクトを逆シリアル化できません

分類Dev

jacksonは、Springのインターフェイスのリストを使用してオブジェクトを逆シリアル化します

分類Dev

jacksonは、Springのインターフェイスのリストを使用してオブジェクトを逆シリアル化します

分類Dev

オブジェクトの1つのインスタンスを逆シリアル化しません

分類Dev

ブーストグラフオブジェクトを逆シリアル化できません

分類Dev

START_ARRAYトークンからオブジェクトのインスタンスを逆シリアル化できません

分類Dev

Java REST API:START_ARRAYトークンからオブジェクトのインスタンスを逆シリアル化できません

分類Dev

ServiceStack5.1.0はオブジェクトフィールドを逆シリアル化しません

分類Dev

インターフェイス属性の1行でオブジェクトを逆シリアル化しますか?

分類Dev

コンストラクターでJsonをオブジェクトに逆シリアル化します

分類Dev

JSONをC#オブジェクトに逆シリアル化します-データは逆シリアル化されません

分類Dev

JSON.NETでのインターフェイスオブジェクトの逆シリアル化

分類Dev

コントローラでjsonオブジェクトを逆シリアル化できません

分類Dev

NSMutableDictionary を継承し、NSKeyedArchiver でシリアル化されたカスタム オブジェクトは、逆シリアル化できません

分類Dev

GSONで逆シリアル化されている親オブジェクトのパラメーターを使用して子オブジェクトをインスタンス化し、ジェネリックを使用しますか?

分類Dev

ジャージーは、リクエストオブジェクトの文字列からjava.util.UUIDを逆シリアル化できません

分類Dev

現在のJSONオブジェクト(例:{"name": "value"})をリストのコレクションタイプに逆シリアル化できません

分類Dev

カスタムファイルタイプのバイトストリームを.NetCoreのPOCOオブジェクトに逆シリアル化します

分類Dev

インターフェイスとオブジェクトの逆シリアル化

分類Dev

セロリタスクのパラメーターとしてのDjangoモデルオブジェクトはEncodeErrorを発生させます-'タイプsomeModelNameのオブジェクトはJSONシリアル化可能ではありません'

分類Dev

Json.netはオブジェクトのリストを逆シリアル化していません

分類Dev

現在のJSONオブジェクトをタイプに逆シリアル化できません

分類Dev

「現在のJSONオブジェクトをタイプに逆シリアル化できません

分類Dev

JSONをオブジェクトに変換すると、JsonMappingException "START_ARRAYトークンからクラスのインスタンスを逆シリアル化できません"がスローされます

分類Dev

xmlファイルxamarinフォームからオブジェクトを逆シリアル化できません

分類Dev

子オブジェクトと兄弟オブジェクトで同じオブジェクト名を持つXMLシリアライザーを使用してオブジェクトをシリアル化することはできません

分類Dev

JMSシリアライザーはオブジェクトのArrayCollectionを逆シリアル化します

分類Dev

jackson @ JsonTypeInfoアノテーションを使用してオブジェクトを元のタイプに逆シリアル化することはできません

Related 関連記事

  1. 1

    Serializableインターフェイスを実装しましたが、クラスオブジェクトはまだシリアル化できません

  2. 2

    PHP:\ Serializableインターフェースを実装するようになったphpオブジェクトを逆シリアル化できません

  3. 3

    jacksonは、Springのインターフェイスのリストを使用してオブジェクトを逆シリアル化します

  4. 4

    jacksonは、Springのインターフェイスのリストを使用してオブジェクトを逆シリアル化します

  5. 5

    オブジェクトの1つのインスタンスを逆シリアル化しません

  6. 6

    ブーストグラフオブジェクトを逆シリアル化できません

  7. 7

    START_ARRAYトークンからオブジェクトのインスタンスを逆シリアル化できません

  8. 8

    Java REST API:START_ARRAYトークンからオブジェクトのインスタンスを逆シリアル化できません

  9. 9

    ServiceStack5.1.0はオブジェクトフィールドを逆シリアル化しません

  10. 10

    インターフェイス属性の1行でオブジェクトを逆シリアル化しますか?

  11. 11

    コンストラクターでJsonをオブジェクトに逆シリアル化します

  12. 12

    JSONをC#オブジェクトに逆シリアル化します-データは逆シリアル化されません

  13. 13

    JSON.NETでのインターフェイスオブジェクトの逆シリアル化

  14. 14

    コントローラでjsonオブジェクトを逆シリアル化できません

  15. 15

    NSMutableDictionary を継承し、NSKeyedArchiver でシリアル化されたカスタム オブジェクトは、逆シリアル化できません

  16. 16

    GSONで逆シリアル化されている親オブジェクトのパラメーターを使用して子オブジェクトをインスタンス化し、ジェネリックを使用しますか?

  17. 17

    ジャージーは、リクエストオブジェクトの文字列からjava.util.UUIDを逆シリアル化できません

  18. 18

    現在のJSONオブジェクト(例:{"name": "value"})をリストのコレクションタイプに逆シリアル化できません

  19. 19

    カスタムファイルタイプのバイトストリームを.NetCoreのPOCOオブジェクトに逆シリアル化します

  20. 20

    インターフェイスとオブジェクトの逆シリアル化

  21. 21

    セロリタスクのパラメーターとしてのDjangoモデルオブジェクトはEncodeErrorを発生させます-'タイプsomeModelNameのオブジェクトはJSONシリアル化可能ではありません'

  22. 22

    Json.netはオブジェクトのリストを逆シリアル化していません

  23. 23

    現在のJSONオブジェクトをタイプに逆シリアル化できません

  24. 24

    「現在のJSONオブジェクトをタイプに逆シリアル化できません

  25. 25

    JSONをオブジェクトに変換すると、JsonMappingException "START_ARRAYトークンからクラスのインスタンスを逆シリアル化できません"がスローされます

  26. 26

    xmlファイルxamarinフォームからオブジェクトを逆シリアル化できません

  27. 27

    子オブジェクトと兄弟オブジェクトで同じオブジェクト名を持つXMLシリアライザーを使用してオブジェクトをシリアル化することはできません

  28. 28

    JMSシリアライザーはオブジェクトのArrayCollectionを逆シリアル化します

  29. 29

    jackson @ JsonTypeInfoアノテーションを使用してオブジェクトを元のタイプに逆シリアル化することはできません

ホットタグ

アーカイブ