【告知】Xamarin.Formsのhttps://t.co/eC46vr1kqiを強くしたようなもの(自称)としてSharedPropertyを公開しました~
— Kペンギン (@penguin_sharp) July 16, 2018
内部的にはUtf8JsonかSpanJsonを使うようにしてます。
.NET Standard 2.0で作ってるのでアプリケーションデータを保存する際にぜひ使ってくださいm(__)mhttps://t.co/VWeI7FDhSW
作者直々の宣伝です
はじめに
皆さん、アプリケーションの設定を保存する際どのようにするか迷ったことはありませんか?
自分はあります。
アプリケーションデータを保存するのって結構プラットフォーム依存なとこがあって、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引数にはUtf8JsonSerializer
かSpanJsonSerializer
を渡すようにしてください。第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