20210615のC#に関する記事は7件です。

UserControlで部分テンプレートを作る

UserControlで部分テンプレートを作る 生のC#で行う方法とprismライブラリを使用した場合で比較しました。 基本の方法 以下のディレクトリ構成にてMainWindow.xamlにRingo.xamlを表示する Solution'Item' Item(project) View MainWindow.xaml Fruit Ringo.xaml MainWindow.xaml <Window x:Class="Fruit.MainWindow" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:local="clr-namespace:Fruit"> <StackPanel> //「local」は表示したいxaml(xaml.cs)のnamespace <local:Ringo/> <TextBox Text="ここはMainWindow"> </StackPanel> </Window> Ringo.xaml <UserControl x:Class="Fruit.SimpleUserControl" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"> <StackPanel Orientation="Horizontal"> <TextBox Text="ここはりんご"> </StackPanel> </UserControl> PrismのRegionManagerを使った場合 ディレクトリを変更 Solution'Item' Item(project) View Fruit Ringo.xaml MainWindow.xaml MainWindow.xaml.cs //New! RegionNames.cs //New! RegionNames.cs //文字列を変数として扱うクラス //なくてもできるけどintelisenceが働くからあった方が良い namespace Item { public static class RegionName { public static readonly string Ringo = "Ringo"; } } MainWindow.xaml.cs //コードビハインドでRegionManagerを登録 namespace Item.View { public partial class MainWindow : Window { public MainWindow(IRegionManager regionManager) { InitializeComponent(); regionManager.RegisterViewWithRegion(RegionName.Ringo, typeof(Ringo)); } } } MainWindow.xaml <Window x:Class="Item.Views.MainWindow" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:prism="http://prismlibrary.com/" //New! prism:ViewModelLocator.AutoWireViewModel="True" //New! xmlns:Item="clr-namespace:Item" //New! Title="Item"> <Grid> //prismのRegionNameに文字列を登録している //文字列はx:static //xmlns:ItemというnamespaceのRegionNameクラスにあるRingoプロパティ <ContentControl prism:RegionManager.RegionName="{x:Static Item:RegionName.Ringo}"> </ContentControl> </Grid> </Window> xamlマークアップ拡張(x:staticなど) 「マークアップ拡張」は、「{」と「}」の2つの中括弧を使用することでXAMLパーサに対し、拡張されたプロパティ指定方法を指示する。 https://techinfoofmicrosofttech.osscons.jp/index.php?XAML%E3%81%AE%E6%9B%B8%E3%81%8D%E6%96%B9%EF%BC%88%EF%BC%91%EF%BC%89#ad009a58
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Gtk3アプリ ポップアップウィンドウを利用する

GtkSharpテンプレートファイル複製ツールの作成 GtkSharpテンプレートファイルをすぐ複製できるツールを作った できること その場で名前の変えたGtkSharpのテンプレートファイルを複製します。 複製元となるテンプレートファイル MainWindow.cs MainWindow.Glade 新規に作るのが面倒だったため、ショートカットですぐ作れるようにした テンプレートファイルの内容を変更することも可能 種類 テンプレートファイル名 Class classTemplate.txt Glade gladeTemplate.txt ツールの使い方 Riderの設定画面でツールを登録する プログラムのパスを設定する 引数を設定する -projectName $SolutionName$ -projectDir $FileDir$ クラスファイルにしたい文字列をコピペする メニュー - Tool - External Toolから実行する ツールを実行するとクラス名の変わったGtkSharpテンプレートファイルが複製されます Riderの機能だとExploerに自動インポートされる。 宣言してShow()関数から実行できます aaaa a1 = new aaaa(); a1.Show(); 実際の画面 インストール方法 NugetからプロジェクトにgtkSharpをインストールするか $ dotnet add package GtkSharp --version 3.24.24.34 GtkSharpテンプレートをインストールする $ dotnet new --install GtkSharp.Template.CSharp ターミナルからも実行可能 $ GtkFileGenerator -projectName 名前空間 name -projectDir プロジェクトDirの絶対パス 続く
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Gtk3アプリ ポップアップウィンドウを作る

GtkSharpテンプレートファイル複製ツールの作成 GtkSharpテンプレートファイルをすぐ複製できるツールを作った Release できること その場で名前の変えたGtkSharpのテンプレートファイルを複製します。 複製元となるテンプレートファイル MainWindow.cs MainWindow.Glade 新規に作るのが面倒だったため、ショートカットですぐ作れるようにした テンプレートファイルの内容を変更することも可能 種類 テンプレートファイル名 Class classTemplate.txt Glade gladeTemplate.txt ツールの使い方 Riderの設定画面でツールを登録する プログラムのパスを設定する 引数を設定する -projectName $SolutionName$ -projectDir $FileDir$ クラスファイルにしたい文字列をコピペする メニュー - Tool - External Toolから実行する ツールを実行するとクラス名の変わったGtkSharpテンプレートファイルが複製されます Riderの機能だとExploerに自動インポートされる。 宣言してShow()関数から実行できます aaaa a1 = new aaaa(); a1.Show(); 実際の画面 インストール方法 NugetからプロジェクトにgtkSharpをインストールするか $ dotnet add package GtkSharp --version 3.24.24.34 GtkSharpテンプレートをインストールする $ dotnet new --install GtkSharp.Template.CSharp ターミナルからも実行可能 $ GtkFileGenerator -projectName 名前空間 name -projectDir プロジェクトDirの絶対パス 続く
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Could not locate VRChat data directory for exception watcher. とかいうエラーがなんもわからん

初めまして、Mouleです。自分用メモとしてQitaはじめます。 VRChatやってたら「Could not locate VRChat data directory for exception watcher」とかいうエラーがマイフレームコンソールに出続けるようになってしまったのでそれについての記事です。 詳細は記事の後半に書きます。 なおGitを使ってる方は解決策3をおすすめします。 解決策1 これは根本的な解決にはならないので根本的に解決したい方は解決策2か3を使ってください。 エラーログを出している該当箇所、UdonSharpRuntimeLogWathcer.csの75行目 Debug.LogError("[UdonSharp] Could not locate VRChat data directory for exception watcher"); を、コメントアウトしてください。(コメントアウトって何って方は、上の行を削除して代わりに下のコードを貼り付けてください。) //Debug.LogError("[UdonSharp] Could not locate VRChat data directory for exception watcher"); これで、エラーを無視するようになります() 解決策2 プロジェクトを新しく作り直して、必要なものを全部移行しましょう。 めんどくさいので、可能なら解決策3を使いましょう。 またGitがわからないという方はこちらの記事をおすすめします。 【Git】【Unity】VRChatterのためのGit入門 解決策3 クローンし直しましょう。 (詳細にも書きますが、自分も原因を完全に理解しているわけではないので、治らなかったらすみません。) 詳細 この部分は、新しいことがわかり次第更新される予定です。 環境 MacBook Pro (15-inch, 2019) Unity2018.4.20f1 VRCSDK 2021.5.21.12.23 UdonSharp v0.19.11 エラーが出るようになったきっかけ デバッグのためにEditorでシーンを再生し、処理が重かったのかUnityがフリーズしてしまったので、Unityを強制的に落としたところこのエラーが出るようになりました。 余談ですが、Unityって結構シーン再生中に落としたりするとやばいエラーが発生することが多いです。 Gitで前後の状態を確認しても特に変更はないので、Editorとかのレベルで何かが変わってしまうみたいです。 つまり普段Gitで管理してる部分には何も異常がないので、クローンしなおせば大方治ります。(諸説あります) エラーの内容と検証 Could not locate VRChat data directory for exception watcher. 何かのディレクトリが無いって怒ってますね。 ログエラー周りのコードを見てみます。 ``` if (logDirectoryWatcher == null && ShouldListenForVRC()) { AssemblyReloadEvents.beforeAssemblyReload += CleanupLogWatcher; // Now setup the filesystem watcher string[] splitPath = Application.persistentDataPath.Split('/', '\\'); string VRCDataPath = string.Join("\\", splitPath.Take(splitPath.Length - 2)) + "\\VRChat\\VRChat"; if (Directory.Exists(VRCDataPath)) { logDirectoryWatcher = new FileSystemWatcher(VRCDataPath, "output_log_*.txt"); logDirectoryWatcher.IncludeSubdirectories = false; logDirectoryWatcher.NotifyFilter = NotifyFilters.LastWrite; logDirectoryWatcher.Changed += OnLogFileChanged; logDirectoryWatcher.InternalBufferSize = 1024; logDirectoryWatcher.EnableRaisingEvents = false; } else { //Debug.LogError("[UdonSharp] Could not locate VRChat data directory for exception watcher"); } } なにやら、VRCDataPathとやらにあるディレクトリを探してますね。 試しにこれを出力したら以下のパスが見れました。 \Users[ユーザー名]\Library\Application Support\VRChat\VRChat なので、その通りのパスのディレクトリを作ってみたのですが、エラーは変わらず表示され続けました。 わっかんね わかんなかったのと、別にエラーのままでいっかなって思ったのでコメントアウトしました、本当にすみません。 Gitで差分を見ても特に異常はなく、過去のコミットに戻ってもエラーは出続けてたので、クローンしなおせば流石に治ると思います(気が向いたら試します) あとがき このエラー文でググっても何も情報が出てこなかったので、将来の自分のために何もわからないまま記事を書きました。 わかる方がいたらぜひ教えてください。 情報が増えたら都度追記します。 読んで頂きありがとうございました。
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

unityで作成したVR空間をoculusに実装する方法-レーザーポインターでオブジェクトを選択する方法-

OculusとUnityの接続が無茶苦茶ハマる OculusとUnityの接続に関して、ネット上に数多くの屍が散見します。 その屍を乗り越えて、下のような実装を行ったので、今後の自分のためにもナレッジを残そうと思います。 完成したVR空間がこちら↓ Unityメモ24Oculus上にUnityで作成した空間を表現し、右手のコントローラーからボタンを操作する設定の実装。これはかなりハマった。成功してよかった〜。、ナレッジをQiitaにまとめよう。#protoout#もいせん pic.twitter.com/6aqwe4q8NT— Unity勉強中の整形外科医:北城雅照|医療者向けプログラミングスクール「もいせん」開校! (@teru3_kitashiro) June 15, 2021 一応公式ドキュメントも貼っておきますが、このドキュメントを乗り越えるのがムチャクチャ大変です。 どMの方は、どうぞ読みといてください。  開発環境 Oculusの初期設定 公式ドキュメントはこちら 1 Oculusアプリをスマホに入れ、Oculusの初期設定を行う この際に、facebookアカウントとリンクさせると、その後の設定がスムーズになります。 2 アプリからデバイスを選択し、その他の設定から開発者モードをオンにする これをオンにすることで、自分が作ったアプリをOculus上に上げることができます。 3 PCとOculusを接続し、PCとのデータのやりとりをOculu上で許可する この設定により、PCから作成したVR環境のデータをOculusに送信することができます。 Unityの初期設定 公式ドキュメントはこちら 1 プロジェクトの立ち上げ 2 ビルド設定を修正 「テクスチャ圧縮」をASTCに変更 「デバイスを実行」を一度refreshを押した後に、自分のデバイスが選択できるようになるので、自分のデバイスを選択 その後「Switch Platform」を選択 終了後、左下の「Player設定」を選択 3 Player設定を修正 企業名とプロダクト名を固有のものに設定 最低APIレベルを「Android 6.0」に設定 4 XRPlugin Managementのインストール インストールが完了すると下図のような設定になっていればOK 5 Oculus Integration(Oculus統合パッケージ)のインストルール *必ず上記の設定が終了してからOculus Integrationをインポートしてください!!! もう一度書きます! 必ず上記の設定を終了させてからOculus Integrationをインポートしてください。まじでハマります。 公式ドキュメントはこちら アセットストアで「Oculus Integration」と検索し、左下のOculusのマークのパッケージをUnityにインストール&インポート。 インポートを軽くするために、Avatar,LipSync,SampleFrameworkのチェックを外しておく。 インポート中にアップグレードを勧められるの、全て「yes」を選択。UnityがRestartされる。 VR環境の構築 1 OVRGazaPointerをprehab化する。 Sceneの中のUIを選択 Hierarchyの中のOVRGazaPointerをPrefabsの中にドラック&ドロップする。 2 OVRCameraRigの設定 1) 新しくSceneを作成し、Hierarchyの中に、prefabsからOVRCameraRigをドラック&ドロップする。 2) 元々あったMian Cameraは削除する。 3) OVRCameraRig/TrackingSpace/RightHandAnchor/RightControllerAnchorの下にPrefabsからOVRControllerPrefabをアタッチする。自動的にコントローラーとしてR Tracked Remoteが設定される。 3 uGUIを構成する 1 Canvasを作成 Canvasのインスペクターを以下のように設定する。 1)CanvasのRender Modeをスクリーンスペース・カメラに変更。 2)CanvasのEventCameraをOVRCameraRig/TrackingSpace/CenterEyeAnchorに設定。1)と2)よって常に正面にCanvasが設定されるようになる。 3)CanvasのGraphicRaycasterコンポーネントを削除。 4)CanvasにOculus/VR/Scripts/UtilのOVRRaycasterを追加。 5)OVRRaycasterのBlocking Objects欄を"すべて"に変更。 以下のようになればOK 2 OVRGazaPointerの設定 1)PrefabsからOVRGazaPointerをHierarchyにドラック&ドロップする。 作成したOVRGazePointerのRay Transform欄は、OVRCameraRig/TrackingSpace/RightHandAnchorを設定する。 3 EventSystemの設定 1)EventSystemからStandaloneInputModuleコンポーネントを削除 2)EventSystemのOculus/VR/Scripts/UtilのOVRInputModuleを追加 3)OVRInputModuleのRay TransformにOVRCameraRig/TrackingSpace/RightHandAnchorを設定 4)カーソルにOVRGazaPointerを設定 5)Joy Pad Click Keyにone(Aボタン),Two(Bボタン),Secondary Index Trigger(Triggerボタン)を設定し、作動するボタンを設定する。 以下のようになっていればOK 4 UI部品を設置 試しにボタンを設置する設定を記載します。 1)CanvasにButtonを設置。 2)AssetsにButtonAction.csを作成し、以下のスクリプトを追加。 ButtonAction.cs using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.UI; public class ButtonAction : MonoBehaviour { [SerializeField] Image image; public void OnClick() { image.color = Color.red; } } 3)Button ObjectにButtonAction.csを設定 4)クリック時のイベントにButtonAction.OnClickを設定 Build & Run 作成したVR空間をOculus上に表見するために、Build & Runを行います。 「デバイスを実行」は自身のデバイを選択してください。 完成したVR空間がこちら(再掲)↓ Unityメモ24Oculus上にUnityで作成した空間を表現し、右手のコントローラーからボタンを操作する設定の実装。これはかなりハマった。成功してよかった〜。、ナレッジをQiitaにまとめよう。#protoout#もいせん pic.twitter.com/6aqwe4q8NT— Unity勉強中の整形外科医:北城雅照|医療者向けプログラミングスクール「もいせん」開校! (@teru3_kitashiro) June 15, 2021
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

TwilioをAzure Functions(C#)で動かす

TwilioをAzure FunctionsとC#で、使用するためのまとめです。 備忘録的な内容なので細かな部分において、説明が雑なところがありますがご了承ください。 事前準備について TwilioやAzureのアカウント登録、VSCodeの拡張機能のインストール方法はここでご説明致しませんのでQiita等でお調べください。 Twilioアカウント @mobilebizさんをフォローするといろいろ情報が集まると思います。 Azureアカウント Visual Studio Code 開発環境(VS2019でもいいですが、私の環境がmacなので・・) Azure Functions拡張機能  Azure Functionsとの連動などで使用します。 Azure Functions Core Tools ローカルの実行で使用します。 Nuget拡張機能 私はNuGet Gallery使ってます。 その他の拡張機能 いろいろ開発に便利なものがあるのでお好みで。 手順 Azure Functionsのプロジェクトを作成する Azure Functionsの拡張機能を使用して、Azure Functionsのプロジェクトを作成します。 まずはAzureのタブを選び、稲妻マークをクリックします。 「Create new project」を選択し、保存先のパスを指定します。 プロジェクトの設定を行います。今回はC#を使用したいので、C#を選びます。 C#のランタイムをしています。今回は、.NET Core 3 LTSを選んでいます。 Twilioから 呼び出してもらうため、HTTP triggerを選びます。 APIの名前を指定します。今回は、twiliosampleを入力しています。 namespaceを指定します。今回は、masaya3.twilioを入力しています。 関数のアクセスの制約を指定します。今回は、初期値であるFunctionを選んでいます。 最後に、新しいウィンドウでプロジェクトを開くかを選びます。今回は、現在のウィンドウをそのまま使用しています。 問題がなければ、Azure Functionsのプロジェクト作成されます。 動作検証 作成したプロジェクトが動くか確認してみます。 F5を押すことで、ビルドされ、問題がなければローカルのサーバが起動します。 ※ローカルで動かすには、Azure Functions Core Tools が必要です。もしインストールされていない場合は、エラーがでるので、エラー内容にそって設定してください。 起動すると、TERMINALにローカルサーバのURLが表示されます。 twiliosample: [GET,POST] http://localhost:7071/api/twiliosample TERMINALに表示されているURLにCtrlを押しながらクリックするか、URLをブラウザで入力しアクセスすると動きを見ることができます。 正常に実行されると以下のような文字が表示されます。 TwilioのSDKをインストール Azure Functionsのベースができましたので、次はTwilioのライブラリをインストールします。 使用するライブラリはこちら VSCodeでF1を押して、メニューからNuget:Open Nuget Galleryを選択します。 メニューから、Microsoft.Azure.WebJobs.Extensions.Twilioを探し、 右のプロジェクト名にチェックをつけて、「Install」をクリックしてインストールします。 ※Twilioだけだといっぱい検索に引っかかるので、Microsoft Twilio等で検索してみてください。 コードを書く ライブラリもインストールできたので、実際のコードを記述していきます。 今回説明しているサンプルコードはこちらで公開しています。 Twilioからの情報取得する API呼び出し時にTwilioから渡されるデータを取得します。 以下は、電話番号を取得しています。 twiliosample.cs string from = req.Form["From"]; データは、Form-Dataに格納されていますので、そこから必要となるデータを取得してください。 どのようなデータが取れるかは、以下のリファレンスを参照してください(これいつも忘れる・・) 発話処理を書く 電話の応答などは、TwiMLを使って記述します。 直接、XMLを作っても良いですが、インストールしたTwilio SDKのVoiceResponseで簡単に作成することができます。 VoiceResponseのSayメソッドで、応答時に話すメッセージを文字が設定できます。 今回は、発話のパラメータとして、日本語音声であるlanguage: "ja-jp"や、音声の種類のvoice: "alice"を指定しています。 発話で登録可能な各種パラメータは、以下のリファレンスを参照してください。 VoiceResponse.ToString()でTwiMLが作成されます。 このTwiMLをAPIの返り値として返します。 返り値の返却方法として、ContentResultを使用し、必ずContentType = "application/xml"を指定します。 これを指定しないとTwilio側で認識されません。 twiliosample.cs var response = new VoiceResponse(); response.Say(from + "から着信がありました。", language: "ja-jp", voice: "alice"); return new ContentResult{Content = response.ToString(), ContentType = "application/xml"}; vocieについて 日本語のVoiceで使用できるパラメータは、alice、Polly.Mizuki、Polly.Takumiです。 manとwomanは指定できないため、aliceと同じになってます。 入力受付を書く 今回は動かしていませんが、ボタンによる入力方法もまとめます。 ボタンの入力は、Gatherを使用します。 これを使用することで、よくある電話を使った入力を実現することができます。 入力後は、Actionパラメータで指定されたURLが呼び出されます。 詳しいパラメータは、以下のリファレンスを参照してください。 タイムアウト後に、発話をさせたい場合は、Gather後に発話のSayを登録します。 twiliosample.cs var digitsResponse = new VoiceResponse(); digitsResponse.Gather(new Gather(numDigits: 入力桁数, timeout:入力のタイムアウト時間, action:"番号入力後の呼び出しURL") .Say("ボタン入力を促すメッセージ"), language: "ja-jp", voice: "alice")); digitsResponse.Say("タイムアウト後のメッセージ", language: "ja-jp", voice: "alice"); return new ContentResult{Content = digitsResponse.ToString(), ContentType = "application/xml"}; ローカルで動作検証する  Azureに登録する前に、ローカル環境で動作を検証します。 今回もF5を押して、ローカルサーバを起動します。 curlなどを使用(私はPostman)して、form-dataにFrom:+8109012345678を入力して、POSTします。 正常に動作すれば、戻り値として、「入力された電番番号ら着信がありました」というメッセージが入ったTwiMLが表示されます。 Azure Functionsにデプロイする ローカルで動きが確認できたら、Azureに登録します。 VSCodeからAzureへサインインが必要となりますが、サインイン方法は、こちらを参照ください まずは、Azureタブを開き、FUNCTIONSから以下のマークをクリックします。 登録先として、ここではすでに作成済みの関数アプリ(higedaruma)を指定しています。 関数アプリから作成する場合は、こちらの記事を参照ください 問題なければ「Deploy」ボタンをクリックします。 デプロイが成功すれば、Azureの関数アプリにtwiliosampleが追加されます。 動きを確認する 関数からtwiliosampleを開き、「コードとテスト」を選択、「テストと実行」をクリックすると、入出力の確認が確認ができます。 事前に動きを見てると、問題が発生したときの切り分けがしやすくなので一度は動作確認をしましょう。 Twilioに登録する Azureに登録した関数アプリをTwilioに登録します。 Azure Functionsのtwiliosampleから、関数のURLの取得を選択し、APIのURLを取得します。 TwilioのWebhookに先ほどコピーしたURLを登録します。 あとは、電話番号に電話をすれば動作を確認できます。 まとめ 半年ぐらいすると、この流れを忘れそうだったので、メモとして作成しました。 サーバを意識せず、デバッグ含めてローカルでできるのはかなり便利です。
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

C#でオブジェクトのシリアライズ・デシリアライズ(json)

概要 C#アプリで設定情報を設定ファイルに書き出し⇔読み出しするためにシリアライズするところで盛大にはまったので、結果を遺しておきます コード シリアライザ /// <summary> /// シリアライズ・デシリアライズをするクラス /// </summary> /// <typeparam name="T">対象クラス</typeparam> class Serializer<T> { /// <summary> /// オブジェクトをUTF-8のjsonファイルにシリアライズする。 /// </summary> /// <param name="obj">対象オブジェクト。要件1=POCOであること。要件2=シリアライズ対象メンバがpublicでgetter/setterがついていること</param> /// <param name="filePath">シリアライズ先のファイルパス。既存の場合は上書きされる。</param> public static void jsonSerializeUtf8(T obj, string filePath) { var options = new System.Text.Json.JsonSerializerOptions { // trueだと出力を整形する WriteIndented = true, // UNICODEエスケープシーケンスにしない対象を指定。やらないと、ASCII文字以外すべてが あ → \u3042 みたいな感じでエスケープされる。 Encoder = System.Text.Encodings.Web.JavaScriptEncoder.Create(System.Text.Unicode.UnicodeRanges.All), }; byte[] jsonOutput = System.Text.Json.JsonSerializer.SerializeToUtf8Bytes(obj, options); System.IO.File.WriteAllText(filePath, System.Text.Encoding.UTF8.GetString(jsonOutput)); } /// <summary> /// シリアライズされたUTF-8のjsonファイルから、オブジェクトを復元する。 /// </summary> /// <param name="filePath">シリアライズされたファイルのパス。</param> /// <returns>復元されたオブジェクト</returns> public static T jsonDeserializeUtf8(string filePath) { byte[] jsonInput = System.IO.File.ReadAllBytes(filePath); var utf8Reader = new System.Text.Json.Utf8JsonReader(jsonInput); return System.Text.Json.JsonSerializer.Deserialize<T>(ref utf8Reader); } } usingなしで動くように書いたので若干もっさいです。 手段がjsonであることについて 設定ファイルの選択肢としてはapp.configあたりがあったり、他のシリアライズ手段としてはxmlシリアライズあたりがありますが、 ・app.configはkey-value式なので複雑な構造はめんどくさい ・xmlシリアライズはLISTの格納時に色々めんどくさいっぽい あたりでjsonに絞りました。 実際、コード内の public static void jsonSerializeUtf8 のコメントに書いた通り、POCOかつgetter/setter付きにすれば問題なく動いてくれています。 ポエムな背景 設定ファイルを読み書きしたい →App.config ・・・xmlで定義しないとだめっぽい?しかもkey-valueだけ? →xml・・・Listが入るとうまくいかない。サンプルコードによると保存時にコードに特別な処理が必要?やってられん →json・・・公式の記事からするとこれが最新の手段だから楽になってくれてるかもしれない・・・頼む・・・→いけた
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む