チュートリアル: C を使用してオブジェクトを永続化する#
JSON シリアル化を使用すると、インスタンス間でオブジェクトのデータを保持できます。これにより、次にオブジェクトがインスタンス化されるときに値を格納して取得できます。
このチュートリアルでは、基本的な Loan
オブジェクトを作成し、そのデータを JSON ファイルに保持します。 その後、オブジェクトを再作成するときに、ファイルからデータを取得します。
重要
次の例では、ファイルが存在しない場合は、新しいファイルが作成されます。 アプリケーションでファイルを作成する必要がある場合、そのアプリケーションには、フォルダーに対する Create
アクセス許可が必要です。 アクセス許可は、アクセス制御リストを使用して設定します。 ファイルが既に存在する場合、アプリケーションに必要なのは下位の Write
アクセス許可だけです。 可能であれば、デプロイ中にファイルを作成し、(フォルダーのアクセス許可ではなく) 1 つのファイルにのみアクセス許可を付与 Read
する方が Create
安全です。 また、ルート フォルダーや Program Files フォルダーよりも、ユーザー フォルダーにデータを書き込む方が安全です。
重要
次の使用例は、JSON ファイルにデータを格納します。 パスワードやクレジット カード情報などの機密データを JSON ファイルに格納しないでください。
必須コンポーネント
ビルドして実行するには、.NET SDK をインストールします。
コード エディターをまだインストールしていなければ、お気に入りのエディターをインストールしてください。
ヒント
コード エディターをインストールする必要がありますか。 Visual Studio をお試しください。
オンラインで .NET サンプルの GitHub リポジトリにアクセスしてサンプル コードを確認することができます。
ローンの種類を定義する
まず、Loan
クラスとそのクラスを使用するコンソール アプリケーションを作成します。
新しいアプリケーションを作成します。 コマンド プロンプトで を入力
dotnet new console -o serialization
して、 という名前serialization
のサブディレクトリに新しいコンソール アプリケーションを作成します。エディターでアプリケーションを開き、
Loan.cs
という名前の新しいクラスを追加します。Loan
クラスに次のコードを追加します。public class Loan : INotifyPropertyChanged { public double LoanAmount { get; set; } public double InterestRate { get; set; } [JsonIgnore] public DateTime TimeLastLoaded { get; set; } public int Term { get; set; } private string _customer; public string Customer { get { return _customer; } set { _customer = value; PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(nameof(Customer))); } } public event PropertyChangedEventHandler? PropertyChanged; public Loan(double loanAmount, double interestRate, int term, string customer) { LoanAmount = loanAmount; InterestRate = interestRate; Term = term; _customer = customer; } }
ローン オブジェクトをインスタンス化する
Program.cs を開き、次のコードを追加します。
Loan testLoan = new(10_000.0, 7.5, 36, "Neil Black");
PropertyChanged
イベントのイベント ハンドラーを追加し、Loan
オブジェクトを変更して変更を表示する処理を行う数行を追加します。 この追加は次のコードで確認できます。testLoan.PropertyChanged += (_, __) => Console.WriteLine($"New customer value: {testLoan.Customer}"); testLoan.Customer = "Henry Clay"; Console.WriteLine(testLoan.InterestRate); testLoan.InterestRate = 7.1; Console.WriteLine(testLoan.InterestRate);
この時点で、コードを実行し、現在の出力を確認できます。
New customer value: Henry Clay
7.5
7.1
このアプリケーションを繰り返し実行すると、常に同じ値が書き込まれます。 プログラムを実行するたびに、新しい Loan
オブジェクトが作成されます。 実際には利率は定期的に変わりますが、アプリケーションを実行するたびに変わるとは限りません。 シリアル化コードとは、アプリケーションのインスタンス間で最新の利率を保持することを意味します。 次の手順では、 クラスにシリアル化 Loan
を追加することで、これを行います。
シリアル化を使用してオブジェクトを永続化する
シリアル化を使用してオブジェクトを System.Text.Json シリアル化するには、型に特別な属性を追加する必要はありません。 既定では、すべてのパブリック プロパティがシリアル化され、すべてのフィールドは無視されます。 ただし、プロパティに注釈を付けて、フィールドを含める必要があることを無視したり、指定したりできます。
次のコードでは、 プロパティを TimeLastLoaded
追加し、 属性で JsonIgnoreAttribute マークしてシリアル化から除外します。
[JsonIgnore]
public DateTime TimeLastLoaded { get; set; }
クラスをシリアル化してファイルに書き込むには、 名前空間と System.Text.Json 名前空間をSystem.IO使用します。 次のコードのように、必要な名前空間への参照を追加すると、完全修飾名の入力が不要になります。
using System.IO; using System.Text.Json;
オブジェクトの作成時に、ファイルからオブジェクトを逆シリアル化するコードを追加します。 次のコードのように、シリアル化されたデータのファイル名を定数としてクラスに追加します。
const string fileName = @"../../../SavedLoan.json";
次に、 オブジェクトを作成する行の後に次のコードを
TestLoan
追加します。 このコードでは、最初にファイルが存在することを確認します。 存在する場合は、ファイルからテキストを読み取り、 メソッドを使用して逆シリアル化します JsonSerializer.Deserialize<TValue>(String, JsonSerializerOptions) 。if (File.Exists(fileName)) { Console.WriteLine("Reading saved file"); string jsonFromFile = File.ReadAllText(fileName); testLoan = JsonSerializer.Deserialize<Loan>(jsonFromFile); testLoan.TimeLastLoaded = DateTime.Now; }
次に、 メソッドを使用してクラスをファイルにシリアル化するコードを JsonSerializer.Serialize<TValue>(TValue, JsonSerializerOptions) 追加します。 ファイルの末尾に次のコードを追加します。
// Serialize it. string json = JsonSerializer.Serialize(testLoan); File.WriteAllText(fileName, json);
この時点で、アプリケーションを再度ビルドして実行できます。 初めて実行すると、利率は 7.5 から始まり、7.1 に変更されます。 いったんアプリケーションを閉じて、再び実行します。 利率を変更するコードの前でも、保存済みのファイルが読み込まれ、利率は 7.1 であるというメッセージがアプリケーションから出力されます。