学習の道二十七:三つのシーケンス化方式のいくつかの注意点

5893 ワード

この間のプロジェクトでは、サービスが切れた場合にメモリのデータを保存する必要がありました.
私达のメモリは実は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种の方法を选びました!
 
に同期します:個人文書目次索引