問題タブ [protobuf-net]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
serialization - protobuf-netはバイナリシリアル化よりも高速ではありませんか?
XMLSerializer、BinaryFormatter、ProtoBufを使用して「Person」クラスをシリアル化するプログラムを作成しました。protobuf-netは他の2つよりも速いはずだと思いました。Protobufのシリアル化はXMLSerializationよりも高速でしたが、バイナリのシリアル化よりもはるかに低速でした。私の理解は間違っていますか?これを理解させてください。お手伝いありがとう。
編集:-コードを変更して(以下で更新)、シリアル化の時間を測定し、ストリームを作成せずに、違いを確認しました。理由を教えてもらえますか?
以下は出力です:-
人は347ミリ秒でプロトコルバッファを使用して作成されました
人は1462ミリ秒でXMLを使用して作成されました
人は2ミリ秒でバイナリを使用して作成されました
以下のコード
c# - パブリックメソッドで属性[DataMember(Order = n)]を宣言する必要がありますか?
私のソリューションでは、値を格納するためのパブリッククラスを作成し、[DataContract/DataMember]属性をすでに宣言しています。
例えば、
}
次に、プロジェクト全体を公開する別のパブリックメソッドを追加する必要があります。[DataMember(Order = 3)]を追加する必要があるのではないかと思います。
protobuf-netでシリアライザーを使用してに格納されているデータをシリアル化する場合は、それらの属性を宣言する必要があることを理解しています。しかし、方法についてはよくわかりません。
助けてください。前もって感謝します。
c# - Protobuf全体で複数のタイプのオブジェクトを送信するにはどうすればよいですか?
私はクライアントサーバーアプリケーションを実装しており、データをシリアル化して送信するためのさまざまな方法を検討しています。私はXmlSerializersを使い始めました。これはかなりうまく機能しましたが、データの生成が遅く、特にネット経由で送信する必要がある場合は大きなオブジェクトを作成します。そこで、Protobufとprotobuf-netを調べ始めました。
私の問題は、protobufが型情報を送信しないという事実にあります。Xmlシリアライザーを使用すると、Xmlにシリアル化されたオブジェクトにオブジェクトの型名が含まれているため、同じストリームでさまざまな(シリアル化可能な)オブジェクトを送受信するラッパーを作成できました。
私はこれに対するいくつかの解決策を検討しました。これには、私のソケットを介して送信される唯一のタイプのオブジェクトであるマスター「状態」タイプクラスの作成が含まれます。ただし、これはXmlシリアライザーで使用していた機能から離れているため、その方向性は避けたいと思います。
2番目のオプションは、オブジェクトのタイプを定義するあるタイプのラッパーでprotobufオブジェクトをラップすることです。(このラッパーには、パケットIDや宛先などの情報も含まれます。)protobuf-netを使用してオブジェクトをシリアル化し、そのストリームをXmlタグの間に貼り付けるのはばかげているようですが、私はそれを検討しました。この機能をprotobufまたはprotobuf-netから取り出す簡単な方法はありますか?
私は3番目の解決策を考え出し、それを以下に投稿しましたが、より良い解決策があれば、それも投稿してください!
フィールド境界のバグに関する情報(を使用 System.String
):
ハッシュ:
シリアル化:
デシリアリゼーション:
field => _mappings[field]
KeyNotFoundException
を探している間スローし63671269
ます。
ハッシュ関数でに置き換えるToInt32
とToInt16
、フィールド値がに設定され29723
て機能します。System.String
のフィールドをに明示的に定義した場合にも機能し1
ます。フィールドを明示的に定義する600542181
と、ハッシュ関数を使用してフィールドを定義するのと同じ効果があります。シリアル化される文字列の値は結果を変更しません。
c# - 動的オブジェクトのシリアル化
DynamicObject
でクラスをシリアライズしようとしましたBinaryFormatter
が、
- 出力ファイルが大きすぎるため、ワイヤに適していません
- 循環参照が処理されない (シリアル化中にスタックする)
手段をシリアライズするDynamicObject
こと自体はほとんどないので、シリアライズしようとしたクラスは次のとおりです。
(ExpandoObject を使用することもできたと思いますが、それは別の話です。)
簡単なテスト プログラムを次に示します。
いくつかのブレークポイントをあちこちに配置すると、obj2 の内容を見ることができ、元のデータが正しく逆シリアル化されているように見えますが、想像力を働かせてデータを移動すると、上記の欠点があります。
私は Marc Gravell の protobuf-net を見ましたが、そのようなコンテキストでそれを使用する方法がよくわかりません (リポジトリから正しいバージョンを選択したかどうかさえわかりませんが、ねえ)。
言葉というよりはコードだとは思いますが、シナリオをこれ以上うまく説明できるとは思いません。この質問をより明確にするために追加できるものがあるかどうか教えてください。
どんな助けでも大歓迎です。
protobuf-net - protobuf-netv2alpha-辞書の問題?
私は数週間前のprotobuf-netのv2のバージョンを非常にうまく使用していました。(Compact Frameworkで実行されるプリコンパイル済みシリアライザーの速度のためにV2を使用したいと思います。)Dictionary型のプロパティを使用してオブジェクトをシリアル化しようとするまで、すべてがうまく機能しました。次のエラーが発生しました。
{"タイプにシリアライザーが定義されていません:System.Collections.Generic.KeyValuePair`2 [[System.String、mscorlib、Version = 2.0.0.0、Culture = neutral、PublicKeyToken = b77a5c561934e089]、[System.String、mscorlib、Version = 2.0 .0.0、Culture = neutral、PublicKeyToken = b77a5c561934e089]] "}
辞書のサポートを改善するために最近変更が加えられたようだったので、今日から最新のコードを入手しました。CF3.5およびFF3.5dllをビルドした後、再試行しました。「フリーズするとモデルを変更できません」という別のエラーが表示されます。DictionaryプロパティからProtoMember属性を削除すると、すべてうまく機能しているようです。
protobuf-netのv2で辞書を使用した人はいますか?これはまだリリースの時期が早すぎて使用できませんか?私の速度テストでは、v2が2倍高速であることが示されましたが、それは正確に見えますか(安定性の低いv2プレアルファビットを使用したいという私の願望を検証しています)。
serialization - Protobuf-netでは、既存のインスタンスが同じ場合、逆シリアル化で再利用できますか?
Protobuf-netを使用しています。シリアル化されたGizmoオブジェクトのリストがあり、各GizmoオブジェクトがGazooオブジェクトを参照しているとします。Gazooオブジェクトは、複数のGizmoオブジェクトによって参照される同じオブジェクトである可能性があります。
この状況で逆シリアル化はどのように機能しますか?
ギズモオブジェクトで同じ参照先のGazoosのコピーを複数取得できますか?
私が期待するのは、シリアル化されたデータのすべての重複に対してGazooの1つのコピーです。
c# - Listに相当する.protoは何ですかプロトブフネットで?
ある程度の一貫性を保つために、多くのオブジェクト モデルにコード生成を使用します。その派生の 1 つは、別の生成モジュールを介して ProtocolBuffers の .proto ファイルを生成しています。ただし、この時点で、List<T>
オブジェクトで生成が発生したときの生成を実装する方法に困惑しています。
これは契約を介して可能であるように見えます:
しかし、それ以外では、VSカスタムツールを使用して.protoファイルを作成するだけでこれを行う方法や可能性があるかどうかはわかりません。何かご意見は?
c# - Protobuf-net とジェネリック
protobuf-net とジェネリックの使用に問題があります。
与えられた:
一般的な int リストを持つ CacheLoadItem は問題なくシリアル化されますが、一般的な文字列リストを持つ CacheLoadItem はシリアル化されません。
最初にシリアル化される一般的なリストと関係があると思います。
一般的な文字列リストを持つ CacheLoadItem には、正しい数の項目が含まれていますが、既定値または null 値が含まれています。
なぜこれが起こるのか誰にも分かりますか?
protobuf-net - [ProtoInclude]を使用する必要があるのはなぜですか?
protobuf-netの継承機能に関する多くの質問を読みました。[ProtoContract]、[ProtoMember]と同じように[DataContract]、[DataMember]を使用できるのではないかと思います。[ProtoInclude]の代わりに[KnowType]を使用できないのはなぜですか?
すでにprotobuf-netのシリアル化に[DataContract]、[DataMember]を使用しているので、この質問を提起します。「Protobuf-net」を追加する必要はありませんでした。「System.Runtime.Serialization」のみを使用しました。
しかし...クラスが何らかのクラスから継承する必要がある場合、[ProtoInclude]属性に「Protobuf-net」を追加する必要がありますか?例えば、
最後に、私は100の子クラスを持っているのだろうか、基本クラス内に100の[ProtoInclude]タグを追加することに夢中になりませんか?
助けのためのadvのThx
ヴィー
c# - protobuf .NETでインターフェイス型のメンバーをシリアル化する方法は?
次のテストは、このエラーで失敗します。
「System.InvalidOperationException : 適切なデフォルト IB エンコーディングが見つかりません。」
私は Protobuf.net のこの実装を使用しています:
http://code.google.com/p/protobuf-net/
私は何か見落としてますか?どうもありがとうございます。