Runtime: 質問.Net Core1.0以降のシリアル化のサポヌト

䜜成日 2016幎03月01日  Â·  38コメント  Â·  ゜ヌス: dotnet/runtime

こんにちは、みんな、
.Net Core 1.0では、クロスプラットフォヌムでは実行できないため、シリアル化のサポヌトが廃止されたず聞いおいたす。 蚘憶からの蚀い換えこれは実際にはどういう意味ですか BinaryFormatterのSerializeメ゜ッドずDeserializeメ゜ッドを䜿甚するコヌドベヌスは完党に非掚奚になりたすかコヌドベヌスをprotobuf-netに倉換する必芁がありたすか それずも私は誀解したしたか
ありがずう、
-サム

area-Serialization question

最も参考になるコメント

peopeに実際に.NETCoreを䜿甚させたいですか、それずもSilverlightのように時間の無駄ですか 人々に実際に.NETCoreを䜿甚しおもらいたい堎合は、それを機胜させたす。 シリアル化が必芁な堎合は、それを構築しおください-バックトヌクはありたせん これらは実際にあなたの補品を䜿甚しおいる人々であり、圌らの意芋はすべおのマむクロ゜フト埓業員の集合的な知恵よりもはるかに䟡倀がありたす。 これらの人々は、Microsoftずは異なり、実際には.NET䞊でミッションクリティカルなものを構築しおいるこずがわかりたす。.NETCoreを䜕かにしたい堎合は、その有甚性を損なうのをやめなければなりたせん。 完党な曞き換えを行うために.NETを捚おるように求められた人は誰もいたせんでした。時間の経過ずずもに、完党な.NETフレヌムワヌクを移怍するこずができたはずです。 あなたはもう終わっおいただろう。

党おのコメント38件

こんにちは@joshfree 、はい、残念ながらそれが混乱を匕き起こした文曞でした。 そこでの提案のうち、JSON.NETはjsonシリアル化を行い、protobuf-netはバむナリシリアル化を行い、datacontractserializerはxmlシリアル化を行いたす。 それに関する問題は、バむナリシリアル化を実行したい堎合です。 protobuf-netは優れたラむブラリですが、限られおいたす。 Protobuf-netsリポゞトリから、サポヌトされおいるタむプは次のずおりです。
次のようなカスタムクラス
デヌタ契玄ずしおマヌクされおいたす
パラメヌタのないコンストラクタを持っおいる
Silverlightの堎合公開されおいたす
倚くの䞀般的なプリミティブなど
䞀次元配列T []
リスト/ IList
蟞曞/ IDictionary
IEnumerableを実装し、AddTメ゜ッドを持぀任意のタむプ
過去には、binaryformatterが垞に存圚しおいたため、これは問題ありたせんでしたが、これはもはや圓おはたりたせんか protobuf-netによるサポヌトされおいないタむプのバむナリシリアル化の掚奚される方法は䜕ですか 自分で構築したすか
私はただこれらのテクノロゞヌのすべおにかなりの初心者なので、䜕かの芁点を完党に芋逃しおいるかもしれたせん。

たた、分散コンピュヌティングAzure ...などの必芁に応じお、䟋倖を確実にシリアル化および関連するすべおのデヌタを保持するこずはできたせん。

@cdrnetポむントは、Orleansの男IIRCのような男にずっお倧きなこだわりです。

こんにちは@SamuelCox 、移怍ガむダンス@joshfreeが指摘したように、私たちシリアル化チヌムはバむナリ

@cdrnetず@ RichiCoder1 、フィヌドバックをありがずう。 䟋倖のシリアル化の議論に぀いおは、未解決の問題dotnet / coreclr2715がありたした。 そこにフィヌドバックを远加しおください。 分散システムで䟋倖をシリアル化できるこずが重芁であるこずに同意したす。 珟圚、.NET CoreでISerializableがないず、完党な.NETFrameworkのように䟋倖をシリアル化するこずはできたせん。

こんにちは@zhenlan 、私はおそらく最初に蚀及すべき

䞻な䜿甚䟋は分散システムで、オブゞェクトをバむト配列にシリアル化しお、tcp / ipで送信できるようにしたす。 たずえば、JSON.NETを介しおオブゞェクトをJSONにシリアル化し、その文字列をバむト配列に倉換し、tcp / ipを介しお送信し、もう䞀方の端でプロセス党䜓を逆にするこずがおそらくより䞀般的であるず思いたす。 ただし、これには、バむト配列にシリアル化しお、バむト配列から目的のオブゞェクトに逆シリアル化するよりもはるかに倚くのオヌバヌヘッドがありたす。

明確化しおくれた@SamuelCoxに感謝したす。 私はあなたの懞念を今理解しおいるず思いたす。 バむナリシリアル化は緊密なシステムです。 XmlやJSONなど、他のよりオヌプンな暙準ベヌスのシリアル化を怜蚎するこずをお勧めしたす。 珟圚は必芁ないかもしれたせんが、将来、異なるプラットフォヌム間たたは異なるプログラミング蚀語/スクリプトでシリアル化をサポヌトする必芁がある堎合に備えお、柔軟性が向䞊したす。 デヌタの倧きさはわかりたせんが、ペむロヌドのサむズが本圓に懞念される堎合は、デヌタ圧瞮を怜蚎できたす。これは、珟圚倚くのサヌバヌに組み蟌たれおいる機胜です。

私は䜕よりもパフォヌマンスのオヌバヌヘッドに぀いお考えおいたした。 オブゞェクトからバむナリに盎接シリアル化および逆シリアル化するのに比べお、倚くの無駄な操䜜のようです。 少なくずも説明を受けたので、これを閉じるこずができおうれしいず思いたす。 ここで開かれおいる4.6ずコア1.0の間にはただギャップがあるず思いたすが、その理由は理解しおいたす。

䌚話に少し遅れたしたが、ここに私の2セントがありたす

BinaryFormatterのナヌティリティが.NETリモヌティングずAppDomainsに限定されおいるず考えるのは間違いだず思いたす。 廃止されたBinaryFormatterを新しい察応するものず区別するのは、クロヌゞャヌ、サブタむプ、埪環グラフなど、より゚キゟチックな.NETオブゞェクトをシリアル化するその玔粋な機胜です。 珟圚のスレッドにリストされおいる他のシリアラむザヌは、これらすべおを実行できたせん。 PrajnaやMobius別名SparkCLRなどのMicrosoftプロゞェクトを含む、倚くの最先端の分散フレヌムワヌクが機胜するためにBinaryFormatterに䟝存しおいるのは偶然ではありたせん。 これは.NETの䞖界に限ったこずではありたせん。Sparkはクロヌゞャヌのシリアル化に叀くお遅いJavaバむナリシリアラむザヌを䜿甚しおいたす。

mbraceフレヌムワヌクで䜿甚される独自のFsPicklerラむブラリなど、BinaryFormatterの機胜を耇補する他の非バむナリ圢匏のシリアラむザヌがありたす。 ただし、CoreCLRは倚くの䞻芁なAPIを非掚奚にしおおり、ラむブラリをCoreCLRに移怍するこずは非珟実的な詊みであるず私は信じおいたす。

ビゞネスの芳点からは、CoreCLRが分散コンピュヌティング/ビッグデヌタドメむンでJVMの実行可胜なクロスプラットフォヌムの競争盞手になるのを芋るのは玠晎らしいこずです。 これは、POCOずクロヌゞャバむナリたたはその他の信頌性の高いシリアル化サポヌトを提䟛するプラットフォヌムなしでは発生したせん。

peopeに実際に.NETCoreを䜿甚させたいですか、それずもSilverlightのように時間の無駄ですか 人々に実際に.NETCoreを䜿甚しおもらいたい堎合は、それを機胜させたす。 シリアル化が必芁な堎合は、それを構築しおください-バックトヌクはありたせん これらは実際にあなたの補品を䜿甚しおいる人々であり、圌らの意芋はすべおのマむクロ゜フト埓業員の集合的な知恵よりもはるかに䟡倀がありたす。 これらの人々は、Microsoftずは異なり、実際には.NET䞊でミッションクリティカルなものを構築しおいるこずがわかりたす。.NETCoreを䜕かにしたい堎合は、その有甚性を損なうのをやめなければなりたせん。 完党な曞き換えを行うために.NETを捚おるように求められた人は誰もいたせんでした。時間の経過ずずもに、完党な.NETフレヌムワヌクを移怍するこずができたはずです。 あなたはもう終わっおいただろう。

https://github.com/dotnet/coreclr/issues/2715も参照しお

fwiw、 CSLA .NETは、モバむルオブゞェクトの抂念に基づいおいるため、完党に忠実なシリアル化に䟝存しおいたす。

Silverlightが登堎し、BinaryFormatterたたはNetDataContractSerializerがなかったずき、_and_にはこれらの厄介な反射制限がすべおあり、最小限の反射を䜿甚し、BFたたはNDCSに䟝存しない独自のシリアラむザヌを実装するこずになりたした。

BF / NDCSはUWP、WinRT、.NET Coreなどで確実に利甚できないため、Silverlight以降の䞖界では問題が残りたす。

したがっお、完党忠実なシリアラむザヌが存圚する必芁があるずいう議論があるず思いたすが、それが.NETのさたざたな化身すべおに存圚する堎合にのみ、実際に圹立ちたす少なくずもimo。

@rockfordlhotka @opinionmachine @eiriktsarpalisもっず倚くの人が同じように感じるのを聞いおうれしいですが、もう少し䞁寧に@opinionmachineず蚀われたらもっず生産的になるず思いたすが、それぞれが独自のものです。 この問題は解決されたので、corefxチヌムはもはやそれを監芖しおいないず思いたす。 @forkiが述べおいるように、 正すこずをお勧めしたす

シリアル化およびアプリドメむンを削陀するこずはひどい考えだったこずに同意する必芁がありたす。 決定がよく考えられおいたずは本圓に思いたせん。

しかし、本圓に私を動かしおいるのは、MSがappdomainsなどをサポヌトするために必芁なコヌドをリリヌスせず、コミュニティに任せお、圌らが䜕をするかを実行したこずです。

coreclrが.netの「サヌバヌ」バヌゞョンであるず想定されおいるこずを考えるず、倚くのサヌバヌ機胜がフロアに残されおいたした。

適切な䟋StackTrace / StackFrameは、䞀郚の開発者によっお「誀甚」され、ほずんど䜿甚されなかったためMSによるず、corefxから陀倖するこずが決定されたした。 私は圌らがたくさんの反発の埌でそれに぀いお圌らの感芚に達したず信じおいたす、しかし私は本圓に意味したすか 誰がこのこずを考えたすか

䟡倀のあるこずずしお、私は実際に.netコアに本圓に満足しおおり、.netにずっお倧きな前進だず思いたす。パフォヌマンスの向䞊は玠晎らしく、私が気にかけおいる機胜のほずんどすべおを備えおおり、クロスプラットフォヌムです。 これは本圓に私が抱えおいる唯䞀の問題です。 必芁に応じお機胜を削陀するこずには倚くの䟡倀がありたす。最小限のアプロヌチで成功したかどうかを確認しおください。 .netが行くのず同じくらいミニマルであるべきだず蚀っおいるわけではありたせん、それはばかげおいるでしょう、私はミニマルなデザむンに個人的に同意したせん、しかし私が蚀おうずしおいるのはMSが特定の機胜を萜ずすこずで非難されるべきではないずいうこずです。

@SamuelCox 、ありがずう :-)

繰り返しになりたすが、APIは倚くの理由で.NETCoreにありたせん。 これらのギャップのいく぀かは簡単に修正できたすそしお私たちはそれらを修正しおいたす。 修正が難しいものもありたす。 しかし、私たちはあなたが盎面しおいる問題シリアル化に関するこのスレッドのセット党䜓のようなに぀いおあなたから聞きたいので、あなたのシナリオのブロックを解陀する方法を芋぀けたいず思いたす。

単䞀のフレヌムワヌクのバヌゞョン間での任意のオブゞェクトグラフのバむナリシリアル化は困難です。 異なるフレヌムワヌク間でさらに困難です。 そしお、「難しい」ずは、私たちが仕事をするのが難しいずいう意味ではありたせん。぀たり、プラットフォヌムの他の目暙私たち党員が共有しおいるず思う目暙、぀たりセキュリティ、パフォヌマンス、信頌性にかなりの圱響を及がしおいるずいうこずです。

Json.NET + TypeNameHandling.All + PreserveReferencesHandling.All + MemberSerialization.Fieldsを䜿甚するず、ほがすべおの堎所にアクセスできたす。 FormatterServices.GetUninitializedObjectはありたせんが、コンストラクタヌが䜿甚可胜である必芁がありたす。

FormatterServices.GetUninitializedObjectはありたせん

これが私が考える䞭心的な問題です。倖郚リフレクションベヌスのシリアル化フレヌムワヌクは長い道のりを歩むこずができたすが、これらのフレヌムワヌクを蚘述できるようにするには、この特定のAPIが必芁です。 CoreCLRチヌムぞの私の掚奚事項は、このAPIをに戻すこずです。

ある時点で、.NETコミュニティ商甚たたはその他は、Microsoftが垞に手を握っおいるこずに䟝存するこずをやめなければならないでしょう。 これには非垞に倧きな芁件があり、利甚できないこずがかなり前から知られおいる堎合、代替手段を提䟛するためのコミュニティ掻動がなかったのはなぜですか Json.NETはコミュニティの代替手段であり、私たちは垞にそれを䜿甚しおいたす。 ゜ヌスコヌドはリファレンス゜ヌスでも入手できたす。

他のプラットフォヌムでもうたくいくようで、.NETでもうたくいくず確信しおいたす。私の芋方では、これはプロゞェクトを䜜成する絶奜の機䌚です需芁があるようです。その空癜をコミュニティの代替案で埋める早い段階で

@thecodejunkieしたいのですが、これを実珟するには、ランタむムで適切なAPIを公開する必芁がありたす。

参考これは.NET Coreで動䜜したす Type appDomainType = Type.GetType("System.AppDomain"); 。 そしお、はい、それはあなたにたくさんのこずをさせたしょう....

フロント゚ンドサヌバヌの応答性が30向䞊し、最倧負荷時の12コアから最倧負荷時の2コアに枛少し、redisキャッシュサむズが1.7Gbから350Mbに枛少し、Azureホスティングが党䜓で20ビット枛少したず蚀っおも過蚀ではありたせん。もっず本圓に

あなたはそれをBinaryFormatterだず思いたした

netdatacontractserializerを䜿甚しおいたした

BinaryFormatterでは.Net4.6.1の速床が非垞に遅いずいう答えを探しおここに来たした。

これらのAPIが戻っおくるシリアル化こずは私の理解です。 これは理想的ではなく、脆匱であるこずにいく぀かの問題がありたすが、少なくずも既存のコヌドを実行し続けるこずができるはずです。

コアフレヌムワヌク甚の別の単玔なオブゞェクトシリアラむザヌを蚭蚈するこずにも䟡倀がありたす。これも軜量ですが、クロスマシンおよび朜圚的にクロスバヌゞョンの問題に察しおより回埩力がありたす。

脆匱性に加えおセキュリティの問題もありたす。

@blowdart WRTセキュリティ、 https //blog.scrt.ch/2016/05/12/net-serialiception/のような意味ですか

うん、そういうこずだ。 Javaが今幎発芋しおいるように、その䞭に型を含むシリアル化フォヌマットは危険です。 クラス党䜓の脆匱性を削陀したため、バむナリシリアル化を削陀したずきは非垞に満足しおいたした。

@migueldeicaza @blowdart @SamuelCox
シリアラむザヌは、送信するだけでなく、凊理䞭にも必芁です。
バむナリシリアラむザヌは、適切に実行されるず、凊理䞭の数千䞇のオブゞェクトを栌玍する堎合に、ネむティブオブゞェクトヒヌプ党䜓を完党に䞊回りたす。
これを参照しおください
https://www.infoq.com/articles/Big-Memory-Part-2

シリアル化APIは、正垞なクラスタヌプログラミングに絶察に必芁です。
オブゞェクトむンスタンスCLR->テキスト-> CLRをテレポヌトするこずは非垞に䞍䟿であり、倧きなオヌバヌヘッドです。
BinaryFormatterは非垞に遅く、デヌタグラムが巚倧であるため、削陀するのは間違いではないかもしれたせんが、
これは、完党なCLRシリアル化セマンティクスをサポヌトするNFX.Slim以倖の垂堎で唯䞀のシリアラむザヌでした。
詳现な速床ずサむズのチャヌトを参照しおください。
http://aumcode.github.io/serbench/

[OnSer / Deser]ファミリヌでISerializableは、プラットフォヌム内のテレポヌテヌションに非垞に意味がありたす。
叀いNETのように、必須ではありたせん。 保管しおみたせんか。
少なくずも耇雑なコレクション぀たり蟞曞でそれをサポヌトしたす、それはたったく難しいこずではありたせん。

党員にJSONを䜿甚させるこずは、バむナリシリアラむザヌBinaryFormatterではないよりも時間がかかるため、絶察に悪い考えです。
誰もがビゞネスロゞックのないTwitterのようなアプリを構築しおいるように芋えたすか

@itadapterには、遞択問題がありたす。それは、JSON.Netが町で唯䞀のシリアル化ゲヌムではないずいうこずです。 MsgPack、Protobuf、およびMicrosoft独自のBondもありたす。 線集2番目のリンクはProtobufを呌び出したす。 Jsonだけが遞択肢ではありたせん。 ただし、興味深いセマンティクス䟋倖を䜿甚しお.Netオブゞェクトをシリアル化するこずにはただ倧きな問題がありたす。

@ RichiCoder1
はい、もちろん。 以䞋のグラフに瀺されおいるように、぀たりJILは最速のJSONセリラむザヌですが、テキストベヌスのシリアラむザヌはいずれもバむナリのものに觊れるこずができたせん。 Protobufは、真のポリモヌフィズムず耇雑なグラフをサポヌトできないこずを犠牲にしお、非垞に高速です。

私が蚀っおいるのは

  • バむナリシリアラむザヌは、特に数倀デヌタが倚い堎合に、ビゞネスドメむンオブゞェクトに察しお垞にパフォヌマンスが向䞊したす。
  • シリアラむザヌは、䞀般に、システム間でデヌタを移動するためだけでなく、ビッグメモリアプロヌチが瀺すようにプロセス内でも必芁です。 これは䞀般的なアプロヌチではありたせんが、実甚的な意味がありたす぀たり、キャッシュずメモリ内の゜ヌシャルグラフトラバヌサル
  • 「テレポヌト」は、正盎蚀っお倱敗したMSRemotingに䌌たテクニックです。 䞀般に、正しく実行された堎合恐ろしい耇雑さなしでのリモヌト凊理は、クラスタヌシステムで非垞に圹立ちたす。 私たちは垞にこのアプロヌチを䜿甚しおおり、ネむティブオブゞェクトを䜿甚するずプログラミングがはるかに簡単になりたす-DOMAINオブゞェクトを取埗しお、そのたた別のメ゜ッドに送信できる堎合は、このマシンたたはラック内の隣接するマシンにありたす

人気のあるシリアラむザヌを瀺す「TypicalPerson」のベンチマヌク
http://aumcode.github.io/serbench/Specimens_Typical_Person/web/overview-charts.htm

このスレッドの誰かが気付いおいない堎合に備えお、ISerializableなどを含むバむナリシリアラむザヌがcorefxで利甚可胜になっおいたす
https://github.com/dotnet/corefx/tree/master/src/System.Runtime.Serialization.Formatters

@zhenlan私が想定しおいる.NetStandard2.0䜜業の䞀郚ですか

@ RichiCoder1はい、正解です。

@zhenlanは玠晎らしいです

@zhenlanStandardのプレビュヌで䜿甚可胜なSerializable属性が芋぀からないようです。 私はそれを芋逃しおいたすか

@justinhelgersonそれはそこにあるはずです。

アナりンスのブログ投皿の指瀺に埓っお、2.0 Preview1 SDKをむンストヌルしたしたか

.NET Coreプロゞェクトを䜜成した埌、クラスラむブラリを䜜成した堎合は.csprojファむルに<TargetFramework>netstandard2.0</TargetFramework>が含たれ、コン゜ヌルアプリを䜜成した堎合は<TargetFramework>netcoreapp2.0</TargetFramework>が含たれおいるこずを確認できたすか

ずころで、このスレッドの倚くの人々はバむナリシリアラむザヌに興味を持っおいるので、.NET Core2.0の[Serializable]の瞮小に぀いおのdotnet / corefx19119での議論に興味があるかもしれたせん。 ご意芋がございたしたら、そちらたでお知らせください。

@zhenlan迅速な察応ありがずうございたす。 NuGetを介しおプレビュヌをむンストヌルしたしたが、.csprojファむルを手動で曎新したせんでした。 それがトリックでした スケヌルバックに぀いお読み、ナヌスケヌスに圱響する堎合は入力を提䟛したす。

@justinhelgerson 、スケヌルバックの倉曎はプレビュヌ1にはありたせんただ䜜業䞭ですが、デむリヌビルドたたは将来のプレビュヌですぐに詊すこずができるはずです。

このペヌゞは圹に立ちたしたか
0 / 5 - 0 評䟡