-
Один из моих читателей блога сказал мне, что это был 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 год.
