前篇介紹了使用DataContract資料合約與DataContractSerializer來序列化資料為XML格式,而在這邊我們介紹如何使用DataContract來做Json個序列化
前言
前篇介紹了使用DataContract資料合約與DataContractSerializer來序列化資料為XML格式,而在這邊我們介紹如何使用DataContract來做Json序列化
建立資料合約到資料類別
一樣建立你要序列化的資料類別與標記DataContract與DataMember,這邊還是用Student為例子
[DataContract]
    public class Student {
        public Student(int id, string name, bool isGraduated) {
            ID = id;
            Name = name;
            Graduated = isGraduated;
        }
        [DataMember(Name="StudentID")]
        public int ID { get; set; }
        [DataMember]
        public string Name { get; set; }
        [DataMember]
        public bool Graduated;
    }Json序列化
再來,我們要增加一個Include
using System.Runtime.Serialization.Json;這邊要稍微注意一下,如果是Windows Phone 7需要參考System.ServiceModel.Web,using System.Runtime.Serialization.Json 才會有效
此時便會出現可以用來做Json序列化的類別,讓我們把DataContractSerializer換成DataContractJsonSerializer
string fileName;
IsolatedStorageFile recordFile;
string recordTargetFolderName;
DataContractJsonSerializer JsonSerializer; //Json Serializer  // 建構函式
        public MainPage()
        {
            InitializeComponent();
            recordFile = IsolatedStorageFile.GetUserStoreForApplication();
            fileName = "student.txt";
            recordTargetFolderName = "StudentRecord";
            JsonSerializer = new DataContractJsonSerializer(typeof(Student));
        }
序列化與反序列與前篇一樣
存檔序列化成Json
public void SaveData(Student saveData)
        {
            string TargetFileName = String.Format("{0}\\{1}",
                                             recordTargetFolderName, fileName);
            if (!recordFile.DirectoryExists(recordTargetFolderName))
                recordFile.CreateDirectory(recordTargetFolderName);
            try
            {
                using (var targetFile = recordFile.CreateFile(TargetFileName))
                {
                    JsonSerializer.WriteObject(targetFile, saveData);
                }
            }
            catch (Exception e)
            {
                Debug.WriteLine(e.Message);
            }
        }
反序列化讀取資料
public Student LoadData()
        {
            Student s = null;
            string TargetFileName = String.Format("{0}\\{1}",
                                              recordTargetFolderName, fileName);
            try
            {
                if (recordFile.FileExists(TargetFileName))
                {
                    using (var sourceStream = recordFile.OpenFile(TargetFileName, FileMode.Open))
                    {
                        s = (Student)JsonSerializer.ReadObject(sourceStream);
                    }
                }
            }
            catch (Exception e)
            {
                Debug.WriteLine(e.Message);
            }
            return s;
        }
結果
這邊使用一樣的範例
這邊會看到開啟檔案後的顯示方式為Json格式
非常容易的,幾乎不需修改任何地方,只要換掉序列化的類別即可!!
DataContractJsonSerializer_WP7.zip
DataContractJsonSerializer-WP8.zip
參考資料
DataContractJsonSerializer Class
Windows Phone 7 Serialization: DataContract Serialization
文章中的敘述如有觀念不正確錯誤的部分,歡迎告知指正 謝謝 =)
另外要轉載請附上出處 感謝



