-
Один из моих читателей блога сказал мне, что это был 2014
-
Он смеялся над тем, что я все еще использую XML
-
В течение 30 минут я записывал JSON на диск вместо XML
-
Это было невероятно легко сделать
-
Это намного проще, чем вы могли ожидать
-
Я исключил ненужный класс и сохранил свои данные в меньшую полезную нагрузку
УСТАНОВИТЕ NUGET ПАКЕТ ДЛЯ JSON.NET
СТАРЫЙ XML-ПОДХОД
-
Это код, который я удалил в Json-ify
- Строки 15 и 50 были изменены, чтобы сделать его Json
- Строки с 71 по 104 были устранены
Старый XML-код:
///////////////////////////////////////////////////////////////////////////////////////////////////////////// // Old Code using XML // // private static async Task SaveToDiskFolders(ObservableCollection<FoldersItem> collection, string filename) { // Creat a save-able object list List<FoldersItemDisk> dataToSave = new List<FoldersItemDisk>(); foreach (FoldersItem item in collection) { dataToSave.Add(new FoldersItemDisk { FolderName = item.FolderName }); } // Make xml out of it string localData = ObjectSerializer<List<FoldersItemDisk>>.ToXml(dataToSave); // Save to disk part 1 StorageFolder storageFolder = ApplicationData.Current.LocalFolder; StorageFile storageFile = await storageFolder.CreateFileAsync(filename, CreationCollisionOption.ReplaceExisting); // Save to disk part 2 using (IRandomAccessStream stream = await storageFile.OpenAsync(FileAccessMode.ReadWrite)) { using (DataWriter dataWriter = new DataWriter(stream)) { dataWriter.WriteString(localData); await dataWriter.StoreAsync(); } } } private async Task ReadFromFileFolders(ObservableCollection<FoldersItem> collection, ResetCollectionWithSource myfunc, string filename) { try { StorageFolder storageFolder = ApplicationData.Current.LocalFolder; StorageFile storageFile = await storageFolder.GetFileAsync(filename); using (IRandomAccessStreamWithContentType readStream = await storageFile.OpenReadAsync()) using (DataReader reader = new DataReader(readStream)) { ulong streamSize = readStream.Size; UInt32 totalBytesRead = await reader.LoadAsync((UInt32)streamSize); string s = reader.ReadString(totalBytesRead); List<FoldersItemDisk> localData = ObjectSerializer<List<FoldersItemDisk>>.FromXml(s); collection.Clear(); foreach (FoldersItemDisk item in localData) { collection.Add(new FoldersItem { FolderName = item.FolderName, Folder = await StorageFolder.GetFolderFromPathAsync(item.FolderName) }); } myfunc(); } } catch (FileNotFoundException) { } } internal static class ObjectSerializer<T> { // Serialize to xml public static string ToXml(T value) { XmlSerializer serializer = new XmlSerializer(typeof(T)); StringBuilder stringBuilder = new StringBuilder(); XmlWriterSettings settings = new XmlWriterSettings() { Indent = true, OmitXmlDeclaration = true, }; using (XmlWriter xmlWriter = XmlWriter.Create(stringBuilder, settings)) { serializer.Serialize(xmlWriter, value); } return stringBuilder.ToString(); } // Deserialize from xml public static T FromXml(string xml) { XmlSerializer serializer = new XmlSerializer(typeof(T)); T value; using (StringReader stringReader = new StringReader(xml)) { object deserialized = serializer.Deserialize(stringReader); value = (T)deserialized; } return value; } }
НОВЫЙ, СОВРЕМЕННЫЙ, JSON-ОСНОВАННЫЙ ПОДХОД
-
После добавления пакета Json.NET я просто изменил код, чтобы он выглядел следующим образом
- Строки с 15 по 18 являются новыми
- Строки с 54 по 57 являются новыми
///////////////////////////////////////////////////////////////////////////////////////////////////////////// // New Code using JSON // // private static async Task SaveToDiskFolders(ObservableCollection<FoldersItem> collection, string filename) { // Creat a save-able object list List<FoldersItemDisk> dataToSave = new List<FoldersItemDisk>(); foreach (FoldersItem item in collection) { dataToSave.Add(new FoldersItemDisk { FolderName = item.FolderName }); } // New JSON approach string localData = JsonConvert.SerializeObject(dataToSave, new JsonSerializerSettings { Formatting = Formatting.Indented }); // Save to disk part 1 StorageFolder storageFolder = ApplicationData.Current.LocalFolder; StorageFile storageFile = await storageFolder.CreateFileAsync(filename, CreationCollisionOption.ReplaceExisting); // Save to disk part 2 using (IRandomAccessStream stream = await storageFile.OpenAsync(FileAccessMode.ReadWrite)) { using (DataWriter dataWriter = new DataWriter(stream)) { dataWriter.WriteString(localData); await dataWriter.StoreAsync(); } } } private async Task ReadFromFileFolders(ObservableCollection<FoldersItem> collection, ResetCollectionWithSource myfunc, string filename) { try { StorageFolder storageFolder = ApplicationData.Current.LocalFolder; StorageFile storageFile = await storageFolder.GetFileAsync(filename); using (IRandomAccessStreamWithContentType readStream = await storageFile.OpenReadAsync()) using (DataReader reader = new DataReader(readStream)) { ulong streamSize = readStream.Size; UInt32 totalBytesRead = await reader.LoadAsync((UInt32)streamSize); string s = reader.ReadString(totalBytesRead); List<FoldersItemDisk> localData = JsonConvert.DeserializeObject<List<FoldersItemDisk>>(s, new JsonSerializerSettings { Formatting = Formatting.Indented }); collection.Clear(); foreach (FoldersItemDisk item in localData) { collection.Add(new FoldersItem { FolderName = item.FolderName, Folder = await StorageFolder.GetFolderFromPathAsync(item.FolderName) }); } myfunc(); } } catch (FileNotFoundException) { } }
Вывод
Сейчас самое время перейти к вашему коду и перенести его в 2014 год.