Bagikan melalui


Memigrasikan data dari kamus properti aplikasi Xamarin.Forms ke preferensi MAUI .NET

Xamarin.Forms memiliki Properties kamus yang dapat digunakan untuk menyimpan data, dan yang diakses menggunakan Application.Current.Properties properti . Kamus string ini menggunakan kunci dan menyimpan object nilai. Nilai dalam kamus disimpan ke perangkat saat aplikasi dijeda atau dimatikan, dan dimuat saat aplikasi dimulai ulang atau dikembalikan dari latar belakang. Untuk informasi selengkapnya tentang kamus properti, lihat Kamus properti.

Saat memigrasikan aplikasi Xamarin.Forms yang menyimpan data dalam kamus properti aplikasi ke .NET MAUI, Anda harus memigrasikan data ini ke preferensi MAUI .NET. Ini dapat dicapai dengan LegacyApplication kelas, dan kelas pembantu, yang disajikan dalam artikel ini. Kelas ini memungkinkan aplikasi .NET MAUI Anda di Android, iOS, dan Windows, untuk membaca data dari kamus properti aplikasi yang dibuat dengan versi Xamarin.Forms sebelumnya dari aplikasi Anda. Untuk informasi selengkapnya tentang preferensi MAUI .NET, lihat Preferensi.

Penting

Tidak ada API untuk mengakses kamus properti aplikasi di .NET MAUI.

Mengakses data properti aplikasi warisan

Kode berikut menunjukkan LegacyApplication kelas , yang menyediakan akses ke data properti aplikasi yang dibuat oleh aplikasi Xamarin.Forms Anda:

Catatan

Untuk menggunakan kode ini, tambahkan ke kelas bernama LegacyApplication di proyek aplikasi .NET MAUI Anda.

namespace MigrationHelpers;

public class LegacyApplication
{
    readonly PropertiesDeserializer deserializer;
    Task<IDictionary<string, object>>? propertiesTask;

    static LegacyApplication? current;
    public static LegacyApplication? Current
    {
        get
        {
            current ??= (LegacyApplication)Activator.CreateInstance(typeof(LegacyApplication));
            return current;
        }
    }

    public LegacyApplication()
    {
        deserializer = new PropertiesDeserializer();
    }

    public IDictionary<string, object> Properties
    {
        get
        {
            propertiesTask ??= GetPropertiesAsync();
            return propertiesTask.Result;
        }
    }

    async Task<IDictionary<string, object>> GetPropertiesAsync()
    {
        IDictionary<string, object> properties = await deserializer.DeserializePropertiesAsync().ConfigureAwait(false);
        properties ??= new Dictionary<string, object>(4);
        return properties;
    }
}

Android

Di Android, LegacyApplication kelas menggunakan PropertiesDeserializer kelas untuk mendeserialisasi data dari file kamus properti aplikasi. Kode berikut menunjukkan PropertiesDeserializer kelas:

Catatan

Untuk menggunakan kode ini, tambahkan ke kelas bernama PropertiesDeserializer di folder Platforms\Android dari proyek aplikasi .NET MAUI Anda.

using System.Diagnostics;
using System.IO.IsolatedStorage;
using System.Runtime.Serialization;
using System.Xml;

namespace MigrationHelpers;

public class PropertiesDeserializer
{
    const string PropertyStoreFile = "PropertyStore.forms";

    public Task<IDictionary<string, object>> DeserializePropertiesAsync()
    {
        // Deserialize property dictionary to local storage
        return Task.Run(() =>
        {
            using (IsolatedStorageFile store = IsolatedStorageFile.GetUserStoreForApplication())
            {
                if (!store.FileExists(PropertyStoreFile))
                    return null;

                using (IsolatedStorageFileStream stream = store.OpenFile(PropertyStoreFile, FileMode.Open, FileAccess.Read))
                using (XmlDictionaryReader reader = XmlDictionaryReader.CreateBinaryReader(stream, XmlDictionaryReaderQuotas.Max))
                {
                    if (stream.Length == 0)
                        return null;

                    try
                    {
                        var dcs = new DataContractSerializer(typeof(Dictionary<string, object>));
                        return (IDictionary<string, object>)dcs.ReadObject(reader);
                    }
                    catch (Exception e)
                    {
                        Debug.WriteLine("Could not deserialize properties: " + e.Message);
                        Console.WriteLine($"PropertyStore Exception while reading Application properties: {e}");
                    }
                }
            }
            return null;
        });
    }
}

iOS

Di iOS, LegacyApplication kelas menggunakan PropertiesDeserializer kelas untuk mendeserialisasi data dari file kamus properti aplikasi. Kode berikut menunjukkan PropertiesDeserializer kelas:

Catatan

Untuk menggunakan kode ini, tambahkan ke kelas bernama PropertiesDeserializer di folder Platforms\iOS dari proyek aplikasi .NET MAUI Anda.

using System.Diagnostics;
using System.IO.IsolatedStorage;
using System.Runtime.Serialization;
using System.Xml;

namespace MigrationHelpers;

public class PropertiesDeserializer
{
    const string PropertyStoreFile = "PropertyStore.forms";

    public Task<IDictionary<string, object>> DeserializePropertiesAsync()
    {
        // Deserialize property dictionary to local storage
        return Task.Run(() =>
        {
            using (var store = IsolatedStorageFile.GetUserStoreForApplication())
            using (var stream = store.OpenFile(PropertyStoreFile, System.IO.FileMode.OpenOrCreate))
            using (var reader = XmlDictionaryReader.CreateBinaryReader(stream, XmlDictionaryReaderQuotas.Max))
            {
                if (stream.Length == 0)
                    return null;

                try
                {
                    var dcs = new DataContractSerializer(typeof(Dictionary<string, object>));
                    return (IDictionary<string, object>)dcs.ReadObject(reader);
                }
                catch (Exception e)
                {
                    Debug.WriteLine("Could not deserialize properties: " + e.Message);
                    Console.WriteLine($"PropertyStore Exception while reading Application properties: {e}");
                }
            }
            return null;
        });
    }
}

Windows

Di Windows, LegacyApplication kelas menggunakan PropertiesDeserializer kelas untuk mendeserialisasi data dari file kamus properti aplikasi. Kode berikut menunjukkan PropertiesDeserializer kelas:

Catatan

Untuk menggunakan kode ini, tambahkan ke kelas bernama PropertiesDeserializer di folder Platforms\Windows dari proyek aplikasi .NET MAUI Anda.

using System.Diagnostics;
using System.Runtime.Serialization;
using Windows.Storage;

namespace MigrationHelpers;

public class PropertiesDeserializer
{
    const string PropertyStoreFile = "PropertyStore.forms";

    public async Task<IDictionary<string, object>> DeserializePropertiesAsync()
    {
        try
        {
            StorageFile file = await ApplicationData.Current.RoamingFolder.GetFileAsync(PropertyStoreFile).DontSync();
            using (Stream stream = (await file.OpenReadAsync().DontSync()).AsStreamForRead())
            {
                if (stream.Length == 0)
                    return new Dictionary<string, object>(4);

                try
                {
                    var serializer = new DataContractSerializer(typeof(IDictionary<string, object>));
                    return (IDictionary<string, object>)serializer.ReadObject(stream);
                }
                catch (Exception e)
                {
                    Debug.WriteLine("Could not deserialize properties: " + e.Message);
                    Console.WriteLine($"PropertyStore Exception while reading Application properties: {e}");
                }
                return null;
            }
        }
        catch (FileNotFoundException)
        {
            return new Dictionary<string, object>(4);
        }
    }
}

Versi Windows kelas PropertiesDeserializer ini memerlukan DontSync metode ekstensi. Kode berikut menunjukkan metode ekstensi ini:

Catatan

Untuk menggunakan kode ini, tambahkan ke kelas bernama Extensions di folder Platforms\Windows dari proyek aplikasi .NET MAUI Anda.

using System.Runtime.CompilerServices;
using Windows.Foundation;

namespace MigrationHelpers;

internal static class Extensions
{
    public static ConfiguredTaskAwaitable<T> DontSync<T>(this IAsyncOperation<T> self)
    {
        return self.AsTask().ConfigureAwait(false);
    }
}

Mengonsumsi data properti aplikasi warisan

Kelas LegacyApplication ini dapat digunakan untuk menggunakan data dari kamus properti aplikasi, di Android, iOS, dan Windows, yang dibuat dengan versi Xamarin.Forms sebelumnya dari aplikasi Anda:

#if ANDROID || IOS || WINDOWS
using MigrationHelpers;
...

int id;
if (LegacyApplication.Current.Properties.ContainsKey("id"))
{
    id = (int)LegacyApplication.Current.Properties["id"];
    Preferences.Set("id", id);
}
#endif

Contoh ini menunjukkan penggunaan LegacyApplication kelas untuk membaca nilai dari kamus properti aplikasi, lalu menulis nilai ke preferensi MAUI .NET.

Penting

Selalu periksa keberadaan kunci dalam kamus properti aplikasi sebelum mengaksesnya, untuk mencegah kesalahan yang tidak terduga.