「[[マイクロソフト系技術情報 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開発]]

トップ   編集 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS