整合性検知とカスタムハンドラ
Wienerはマスターデータとソース定義の不整合を自動的に検知し、検知後の挙動をカスタムハンドラで制御できます。
検知のタイミング
1. ロード時(LoadBasicPackFromHash の第二引数)
開発用ロードメソッド LoadBasicPackFromHash の第二引数に Action<string[]> デリゲートを渡すと、ロード時に不整合が見つかったクラス名の一覧が返ってきます。
WienerManager.LoadBasicPackFromHash(path, (missingTargets) => {
// missingTargets: 不整合が見つかったクラス名の配列
foreach (var target in missingTargets)
{
Debug.LogWarning($"不整合: {target}");
}
});
不整合があってもロードは成功し、ソースに存在してバイナリに存在しないデータは default 値が補填されます。
2. プロパティアクセス時(SetMissingDelegate)
SetMissingDelegate でデリゲートを登録しておくと、LoadBasicPackFromHash でロードした際に正常にロードできなかったマスターデータのプロパティへのアクセスを検知できます。
全体の使用例
var wm = new WienerManager();
wm.LoadBasicPackFromHash(path, (missingTargets) =>
{
// ロード時:不整合が見つかったクラス名の配列が返ってくる
foreach (var target in missingTargets)
{
Debug.LogWarning($"不整合: {target}");
}
});
wm.SetMissingDelegate((className) =>
{
// プロパティアクセス時:不整合なマスターへのアクセスが発生したクラス名が返ってくる
Debug.LogError($"未ロードマスターへのアクセス: {className}");
});
// Name が不整合でロードできていない場合、SetMissingDelegate のデリゲートに通知が飛ぶ
var name = wm.Item[0].Name;
本番モードと開発モードの違い
本番ロード(LoadBasicPack) | 開発ロード(LoadBasicPackFromHash) | |
|---|---|---|
| 不整合発見時 | 即エラー返却(安全停止) | 第二引数デリゲートで不整合クラス一覧を通知 |
| 欠損フィールド | ロード失敗 | default 値を補填して継続 |
| プロパティアクセス検知 | — | SetMissingDelegate で検知可能 |
| 用途 | リリースビルド | 開発・CI・デバッグ |
活用シナリオ
| 環境 | やること |
|---|---|
| 開発時 | onMissingTargets でログ出力、SetMissingDelegate でEditorダイアログ |
| CI実行時 | onMissingTargets の配列が空でなければビルドエラー |
| チーム通知 | onMissingTargets の内容を Slack / Discord へ Webhook 送信 |
CSV出力
WriteCSV を使うと内部で保持しているデータをヘッダー付きCSVとして取得できます。
戻り値は Dictionary<string, string>(Key: ファイル名、Value: CSV内容)です。
var csvs = WienerManager.WriteCSV();
foreach (var csv in csvs)
{
File.WriteAllText(csv.Key, csv.Value);
}
用途
- バイナリの中身を確認したいとき
- 他ツール・スクリプトでデータを集計したいとき
- データの差分をとりたいとき(git diff等)
- 開発中のアプリからデバッグコマンドでマスターデータの中身をSlackへ送信したいとき
関連
- 簡易難読化 — 改ざん検知との組み合わせ
- バージョン管理 — 開発データの本番除外
- C# API リファレンス