Статьи

Get With the Times — избавьтесь от раздутого формата данных XML и переключитесь на JSON

  1. Один из моих читателей блога сказал мне, что это был 2014

  2. Он смеялся над тем, что я все еще использую XML

  3. В течение 30 минут я записывал JSON на диск вместо XML

  4. Это было невероятно легко сделать

  5. Это намного проще, чем вы могли ожидать

  6. Я исключил ненужный класс и сохранил свои данные в меньшую полезную нагрузку

УСТАНОВИТЕ NUGET ПАКЕТ ДЛЯ JSON.NET

  1. В Visual Studio используйте меню Инструменты

    image001

    Рисунок 1: Добавление пакета NuGet — Json.Net

СТАРЫЙ XML-ПОДХОД

  1. Это код, который я удалил в 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-ОСНОВАННЫЙ ПОДХОД

  1. После добавления пакета 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 год.