学習の道二十七:三つのシーケンス化方式のいくつかの注意点
5893 ワード
この間のプロジェクトでは、サービスが切れた場合にメモリのデータを保存する必要がありました.
私达のメモリは実は1つの构造の比较的に复雑なオブジェクトなため、入れ子の比较的に复雑で、符号化がない前に任务の计画をすべて手配して、方案はメモリのオブジェクトに対してJSONシーケンス化を行った后にローカルのファイルの中で保存して、実はとても简単なことを考えて、しかし実际に符号化する时やはり多くのシーケンス化の方面の问题に出会ったので、最大の原因は、私たちがシーケンス化の方法を理解していないことです.
次に、よく使われるシーケンス化方法についてお話しします.文の中でコードが少ないかもしれませんが、主に注意点を話します.
1.バイナリシーケンス化
利点:[Serializable]シーケンス化プロパティがマークされている限り、このオブジェクト内の任意のもの(プライベート、共通)はシーケンス化されてバイナリになります!
制限点:このシーケンス化方式は眉ひげをつかむように、何でもシーケンス化され、ファイルに保存された内容はバイナリで何の意味もありません.読めません.
しかし、[NonSerialized]でシーケンス化できるもの、シーケンス化しないものを設定することもできます.
2.JSONシリアル番号
利点:プラットフォーム間でデータを転送し、シーケンス化後の構造が明確で解析しやすい!
制限点:しかし、シーケンス化時にこのような問題が発見されました(fastJSONクラスライブラリを使用しています):
①オブジェクトにパラメータのないコンストラクション関数があるかどうかは、エラーが発生します(つまり、下位コードがそのオブジェクトを反射するときにエラーが発生します)
使用する場合.NETが持参したJSON変換類でもこのような問題が発生!
3.XMLシーケンス化
利点:プラットフォームにまたがるデータ伝送、構造がはっきりしている.NETには強力なクラスライブラリサポートがあります!
制限点:しかし、時には万能ではありません.それは2つの制限があるからです.
①たとえば、以下のName属性はシーケンス化できません.Setがプライベートに設定されているからです.
②オブジェクトにディクショナリ変数があるとシーケンス化できなくなる
DictionaryはXMLシーケンス化をサポートしていないため、自分でXMLシーケンス化を実現することもできますが、DictionaryのKeyとValueをオブジェクトにカプセル化してリストセットを形成することで、XMLシーケンス化を使用することができます.
DictionaryのXMLシーケンス化を1つのトランスフォームで実現できます!
最后に私达はバイナリシーケンス化を使って问题を解决して、実は最も良いのはやはりXMLを使ってシーケンス化を行って、しかし私达のプロジェクトの中の対象があまりにも复雑なため、その上タイプが多すぎてXMLシーケンス化の困难を重くして、仕方なく最もこする1种の方法を选びました!
に同期します:個人文書目次索引
私达のメモリは実は1つの构造の比较的に复雑なオブジェクトなため、入れ子の比较的に复雑で、符号化がない前に任务の计画をすべて手配して、方案はメモリのオブジェクトに対してJSONシーケンス化を行った后にローカルのファイルの中で保存して、実はとても简単なことを考えて、しかし実际に符号化する时やはり多くのシーケンス化の方面の问题に出会ったので、最大の原因は、私たちがシーケンス化の方法を理解していないことです.
次に、よく使われるシーケンス化方法についてお話しします.文の中でコードが少ないかもしれませんが、主に注意点を話します.
1.バイナリシーケンス化
利点:[Serializable]シーケンス化プロパティがマークされている限り、このオブジェクト内の任意のもの(プライベート、共通)はシーケンス化されてバイナリになります!
制限点:このシーケンス化方式は眉ひげをつかむように、何でもシーケンス化され、ファイルに保存された内容はバイナリで何の意味もありません.読めません.
しかし、[NonSerialized]でシーケンス化できるもの、シーケンス化しないものを設定することもできます.
2.JSONシリアル番号
利点:プラットフォーム間でデータを転送し、シーケンス化後の構造が明確で解析しやすい!
制限点:しかし、シーケンス化時にこのような問題が発見されました(fastJSONクラスライブラリを使用しています):
①オブジェクトにパラメータのないコンストラクション関数があるかどうかは、エラーが発生します(つまり、下位コードがそのオブジェクトを反射するときにエラーが発生します)
使用する場合.NETが持参したJSON変換類でもこのような問題が発生!
3.XMLシーケンス化
利点:プラットフォームにまたがるデータ伝送、構造がはっきりしている.NETには強力なクラスライブラリサポートがあります!
制限点:しかし、時には万能ではありません.それは2つの制限があるからです.
①たとえば、以下のName属性はシーケンス化できません.Setがプライベートに設定されているからです.
1 public class Test
2 {
3 public string Name { get; private set; }
4 }
②オブジェクトにディクショナリ変数があるとシーケンス化できなくなる
DictionaryはXMLシーケンス化をサポートしていないため、自分でXMLシーケンス化を実現することもできますが、DictionaryのKeyとValueをオブジェクトにカプセル化してリストセットを形成することで、XMLシーケンス化を使用することができます.
1 public class Person
2 {
3 public string Name { get; set; }
4 }
5
6 public class PersonKeyValue
7 {
8 public string Key { get; set; }
9
10 public Person Value { get; set; }
11 }
12
13 public class Test
14 {
15 public void XMLSerialize()
16 {
17 Dictionary<string, Person> dictionary = new Dictionary<string, Person>();
18 List<PersonKeyValue> list = new List<PersonKeyValue>();
19 foreach (KeyValuePair<string, Person> person in dictionary)
20 {
21 list.Add(new PersonKeyValue { Key = person.Key, Value = person.Value });
22 }
23
24 // list XML
25 }
26 }
DictionaryのXMLシーケンス化を1つのトランスフォームで実現できます!
最后に私达はバイナリシーケンス化を使って问题を解决して、実は最も良いのはやはりXMLを使ってシーケンス化を行って、しかし私达のプロジェクトの中の対象があまりにも复雑なため、その上タイプが多すぎてXMLシーケンス化の困难を重くして、仕方なく最もこする1种の方法を选びました!
に同期します:個人文書目次索引