C#
.NET
Xamarin
.NETStandard

【.NET Standard】SharedPropertyでアプリケーション設定を保存する

作者直々の宣伝です

はじめに

皆さん、アプリケーションの設定を保存する際どのようにするか迷ったことはありませんか?

自分はあります。

アプリケーションデータを保存するのって結構プラットフォーム依存なとこがあって、Xamarin.NativeではSetting.Pluginとか、Xamarin.FormsではApplication.Current.Propertiesとかで、保存することになるかと思いますが、これらはプラットフォームごとの実装をしています。

時代はそろそろ.NET Standardだと思いますし、.NET Standardならプラットフォームのことなんか考えたくないところです。
Akavacheという良さげなライブラリがすでにありますが、これはSQLite3を使っていたりJson.NETを使っていたりと、すこし大げさな感じがします。

というわけがあったりして、軽量で.NET Standardなアプリケーション設定保存ライブラリーを作ってしまったという感じです。

使い方

NuGetで以下のどちらかをいれてください。必要なものは自動的に付いてくるはずです。

名前で気づくかと思いますが、内部的にはUtf8JsonまたはSpanJsonを使うようにしています。
基本的にはUtf8Jsonのほうを使うかと思いますが、.NET Core 2.1用にSpanJsonにも対応させています。

基本的な処理

var sharedDictionary = new SharedDictionary(Utf8JsonSerializer.Default, IsolatedFileStorage.Default, null);
// Storageに保存されている設定を読み込む
await sharedDictionary.LoadFromStorageAsync();

// もちろん基本データ型の保存はできて
sharedDictionary.SetProperty("text", "sssss");
sharedDictionary.SetProperty("number", 1234);

// Utf8JsonまたはSpanJsonによって、ユーザー定義型の保存もできる
sharedDictionary.SetProperty("data", new Data());

// Storageに書き込む
await sharedDictionary.SaveToStorageAsync();

// 設定を読み込む
string text = sharedDictionary.GetProperty<string>("text");
int number = sharedDictionary.GetProperty<int>("number");
var data = sharedDictionary.GetProperty<Data>("data");

APIを見ればなんとなくわかるかとおもいます。

SharedDictionaryのコンストラクターの第1引数にはUtf8JsonSerializerSpanJsonSerializerを渡すようにしてください。第2引数をIsolatedFileStorageにすることによって、.NET Standardがアプリケーション固有の領域に保存してくれます。

難読化と暗号化

アプリケーション設定を保存する際に、ある程度需要のある難読化 or 暗号化ですが、必要そうなのでできるようにしておきました。

SharedDictionaryの第3引数がそれらの設定する場所で、難読化ならSimpleConverterを、暗号化ならAesCryptoConverterとかRijndaelCryptoConverterを渡してあげてください。

Xamarin.iOS

もし、Xamarin.iOSでも利用するならUtf8Jsonのコードジェネレートが必要になります。SharedPropertyのREADMEに少し書いておきましたが、Xamarin.iOSで使う場合はいろいろとやらないといけないことがあるのだと留意してください。

おわりに

結構省いたシンプルな説明にしたので、詳しくはREADMEを見てください。Issue/PRなどあれば受け付けてますので、遠慮なく投げてください!

詳しい作成背景とかは個人ブログのほうに書いたので気になれば見てください。

ConcurrentSharedDictionaryについては非常に雑な実装をしたと思ってるので、もう少しまともな実装を思いついた方はご連絡お願いしますm(__)m