「[[マイクロソフト系技術情報 Wiki>http://techinfoofmicrosofttech.osscons.jp/]]」は、「[[Open棟梁Project>https://github.com/OpenTouryoProject/]]」,「[[OSSコンソーシアム .NET開発基盤部会>https://www.osscons.jp/dotNetDevelopmentInfrastructure/]]」によって運営されています。 -戻る --[[.NET開発]] --[[.NET Coreへの移行]] * 目次 [#iae4e923] #contents *概要 [#nc729dde] -以下の様な[[様々なシリアライザ>#f9129591]]も存在するが、~ ココでは、BinaryFormatterのバイナリシリアライズのみ取り扱う。 -System.Runtime.Serialization名前空間のBinaryFormatterクラスと共に使用する。 *詳細 [#m1c7bdf2] **使用例 [#te0a05d7] BinaryFormatterのバイナリシリアライズを使用すると、以下のような処理を実装できる。 ***オブジェクト ⇔ バイト変換 [#cb5f9514] -オブジェクトをバイトに変換できる。 -オブジェクトをバイトから復元できる。 ***オブジェクトのセーブ&ロードや転送 [#j389d347] -ファイルにセーブ&ロードできる。 -ネットワーク経由で転送できる。 ***参考 [#r89a9471] -.NET Tips (VB.NET,C#...) --オブジェクトの内容をバイナリファイルに保存、復元する~ https://dobon.net/vb/dotnet/file/binaryformatter.html -[[.NET 5への移行]]で、obsolete and prohibitedに。 **様々なシリアライザ [#f9129591] 以下の様なシリアライザも存在する。 ***バイナリ [#r089b39d] -DataContractSerializer -MsgPackFormatter - [[MessagePack>#x915dcfa]] ***XML [#odd9cf36] -XmlSerializer -DataContractSerializer ***JSON [#xca3001a] -純正 --DataContractJsonSerializer --JsonSerializer - System.Text.Json -その他 --JsonSerializer - JSON.NET --JsonSerializer - JSON.NET BSON ※ [[JSONのparseを色々試してみた。]] **相互運用性 [#se5554ec] ***[[バージョン間>https://opentouryo.osscons.jp/index.php?%E9%80%9A%E4%BF%A1%E5%88%B6%E5%BE%A1%E6%A9%9F%E8%83%BD#ea818437]] [#t313927b] 相互運用性あり ***[[x86, 64間>https://opentouryo.osscons.jp/index.php?%E9%80%9A%E4%BF%A1%E5%88%B6%E5%BE%A1%E6%A9%9F%E8%83%BD#fcf48397]] [#bbc05979] 相互運用性あり(ポインタだけ注意) ***net, netcoreapp [#d3d21bb5] 以下の[[検証コード>#j95f127f]]で検証した結果、基本的に相互運用性はありそう。 -net ⇔ netcoreapp~ Windows上であれば動作する。 -netcoreapp(on Windows) ⇔ netcoreapp(on Linux)~ netcoreapp同士であれば動作する。 -net ⇔ netcoreapp(on Linux)~ netcoreapp(on Linux) → netの場合に限り動作しないケースがあった。~ (デシリアライズしたDictionaryにIConvertibleが無いとかそういう例外)。 **パフォーマンス [#b0ac71c8] -一般的に遅いとされる。 -ゲーム業界では、[[MessagePack>#x915dcfa]]などの、~ POCOシリアライズに特化した高速なシリアライザが開発されている。 **セキュリティ [#za8911a9] 最近、問題視されてきている模様~ (オープンなサービスなどで、不特定多数ユーザから~ バイナリデータをインジェクションされるのが脅威)。 *参考 [#kb243639] **パフォーマンス [#ndd1c418] -neue cc - .NET(C#)におけるシリアライザのパフォーマンス比較~ http://neue.cc/2010/05/29_261.html **セキュリティ [#a216bfe6] - 詳細は[[コチラ>.NET 5への移行#x00b62f4]] **実装 [#c78b88bf] -https://github.com/OpenTouryoProject/OpenTouryo/blob/develop/root/programs/CS/Frameworks/Infrastructure/Public/IO/BinarySerialize.cs **相互運用性検証 [#j95f127f] -https://github.com/OpenTouryoProject/SampleProgram/tree/master/Other/BinarySerialize/TestBinarySerializeXplat **[[Protocol Buffers>#m200a1bf]] と [[MessagePack>#x915dcfa]] [#xef6d25f] -クロスプラットフォーム&高性能なシリアライザ -双方とも、JSONのバイナリ版([[CBOR]])みたいなものだが、 -少々、思想が異なる。~ 端的に言うと、 --[[Protocol Buffers>#m200a1bf]]は、 ---gRPC用に設計されている。 ---運用を見据えるなら [[Protocol Buffers>#m200a1bf]]。 --[[MessagePack>#x915dcfa]]は、 ---ビッグデータ用のユーティリティとして設計されている。 ---手軽に使いたいなら [[MessagePack>#x915dcfa]]。 ***[[Protocol Buffers]] [#m200a1bf] -Googleによって開発され、主に、gRPCで使用される。 -[[Protocol Buffers]]はIDLを使用するので、 --データの構造化に重きを置いていると言える。 --クロスプラットフォーム対応が完全になり得る。 ***MessagePack [#x915dcfa] -serialize/deserializeの速度とデータ長の圧縮をアドバンテージとしている。 -IDLが無いので、クロスプラットフォームが保証されない部分がある模様。 -なんとなく、[[CBOR]]的([[CBOR]]から参照されている)で、~ IETF標準化が提案されたが、下位互換を重視するため~ 標準化を拒否した等の、開発のポリシーが読み取れる。~ (開発者がビッグデータ界隈の出身である事を考えると解り易い)。 -参考 --MessagePackのIETFへの提案に関する困惑 - たごもりすメモ~ https://tagomoris.hatenablog.com/entry/2013/03/01/130433 **microsoft.com [#nc00c9ec] -.NET でのシリアル化~ https://docs.microsoft.com/ja-jp/dotnet/standard/serialization/ --バイナリ シリアル化~ https://docs.microsoft.com/ja-jp/dotnet/standard/serialization/binary-serialization -シリアル化 --(C#)~ https://docs.microsoft.com/ja-jp/dotnet/csharp/programming-guide/concepts/serialization/ ---チュートリアル: C# を使用してオブジェクトを永続化する~ https://docs.microsoft.com/ja-jp/dotnet/csharp/programming-guide/concepts/serialization/walkthrough-persisting-an-object-in-visual-studio --(Visual Basic)~ https://docs.microsoft.com/ja-jp/dotnet/visual-basic/programming-guide/concepts/serialization/ ---Visual Studio でのオブジェクトの永続化 (Visual Basic)~ https://docs.microsoft.com/ja-jp/dotnet/visual-basic/programming-guide/concepts/serialization/walkthrough-persisting-an-object-in-visual-studio -BinaryFormatter Class (System.Runtime.Serialization.Formatters.Binary)~ https://docs.microsoft.com/ja-jp/dotnet/api/system.runtime.serialization.formatters.binary.binaryformatter ---- Tags: [[:プログラミング]], [[:.NET開発]]