スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

[C#] yamlライブラリを検討してみました。

C#の設定ファイルの検討をしてみました。


C#でアプリケーションを設定する際に必ずといっていいほど設定ファイルが必要となってきます。

私が今まで経験した中で、Windowsアプリケーションでの設定ファイルは、
・iniファイル
・xmlファイル
・レジストリ
でした。

しかし、どれもしっくり来ません。
それは、以下の理由があります。

iniファイル
 メリット :
  ・伝統的な設定方法で、ライブラリやサンプルが充実している。
  ・Windowsを使っている人に説明しやすい。(よく使われているため)
  ・エディタ等で開いた際、見やすい。
 デメリット :
  ・配列などの階層化したデータの保存ができない
  ・クラスのシリアライズができない
  ・なんかダサい

xmlファイル
 メリット
  ・階層化データを表現できる。
  ・ライブラリが揃っている。
  ・クラスのシリアライズが可能である。
  ・Visual Studio等の[設定]にて簡易に作成できる(アプリケーション設定のみ)
 デメリット
  ・エディタ等で開いた際、編集がしづらい。(よく客先で怒られます。。。)

レジストリ
 メリット
  ・ユーザに勝手に変更が加えられない
  ・高速に読み込める
 デメリット
  ・エディタ等で変更ができない
  ・なんか色々大変で、客先でバグったときにテンパる。

このサイトに上記設定ファイルフォーマットの使い方等が載っています。

ということで、上記設定ファイルはいやだなぁーと思いつつ、、、。

そこで、RubyやPython等のLL言語では、標準となっているjsonやyamlをC#で動かせるライブラリを調べてみました。
一応ライブラリは存在するようですが、C#はLL言語と違い型の定義があります。
なので、疑心暗鬼になり、ちょっとした動作確認をしてみました。

[YAML]
Yaml Library for .NET
これは、非常に使えなかった。
以下に使えなかった点を上げます。
・yamlを書きこむ際、オブジェクトをシリアライズできないため、
 自分で作る必要がある。
・yamlを読み込む際、keyによるアクセスができない。
・作りこみが雑。

一応、設定ファイルを作るコードは作ってみましたが、
載せる必要も無いため、省略します。
オリジナルのコードも見てみましたが、酷過ぎる。時間の無駄でした。
こんなコードでYAML for.NETと名乗らないで欲しいです。

YamlSerializer for .NET
これは、使えます。
自分で作成したオブジェクトのシリアライズ、デシリアライズを簡単に行うことができます。
また、細かい配慮が感じられ、オリジナルクラスや、List等の配列もyaml化してくれます。
ライセンスMITなので、商用での使用も可能です。
(というか、作った人、日本人なんだ。。。)

使い方は、
ここから、dllを取得し、[参照設定]にて、dllの参照を追加するだけです。

以下に、コードを乗せておきます。
このコードは、コンソールアプリケーションです。
以下のコードを追加し、Mainを実行すると、

%YAML 1.2
---
!YamlTest.Person
IDs:
Capacity: 4
ICollection.Items: [1, 12]
Cats:
Capacity: 4
ICollection.Items:
- Age: 1
Name: トラ
- Age: 2
Name: たま
Age: 22
Name: 智子



のようなyamlを作ることができます。
ここでは、オリジナルクラスとして
Person <-- Cat
Car
のクラスを作っています。



Program.cs

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

using System.Yaml;
using System.Yaml.Serialization;


namespace YamlTest {
class Program {
// メイン
static void Main(string[] args) {
string yamlpath = "person.yaml";
/*** オリジナルオブジェクト ***/
Person satoko = new Person("智子", 22);
satoko.Cats.Add(new Cat("トラ",1));
satoko.Cats.Add(new Cat("たま",2));
satoko.IDs = new List{1 , 12};

YamlSerializer ys;

// Personシリアライズ - Console
ys = new YamlSerializer();
string yaml = ys.Serialize(satoko);
Console.WriteLine(yaml);
// Personデシリアライズ - Console
ys = new YamlSerializer();
Person desatoko = (Person)ys.Deserialize(yaml)[0];

// Personシリアライズ - File
ys.SerializeToFile(yamlpath, satoko);
// Personデシリアライズ - File
ys = new YamlSerializer();
desatoko = (Person)ys.DeserializeFromFile(yamlpath)[0];


/*** コンストラクタに引数が必要な場合 ***/
Car vitz = new Car("123-456");
vitz.Name = "Vitz";

// Carシリアライズ - Console
ys = new YamlSerializer();
yaml = ys.Serialize(vitz);
Console.WriteLine(yaml);
/* Console 出力
%YAML 1.2
---
!YamlTest.Car
Number: 123-456
Name: Vitz
...
*/

// Carデシリアライズ - Console
YamlNode.DefaultConfig.AddActivator(
() => new Car(""));

Car devitz = (Car)ys.Deserialize(yaml)[0];

}
}
}




Person.cs

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace YamlTest {
public class Person {


private int _Age = 20;
private string _Name = "";

private List _IDs = new List();
private List _Cats = new List();


public string Name { get { return _Name; } set { _Name = value; } }

public int Age { get { return _Age; } set { _Age = value; } }

public List IDs { get { return _IDs; } set { _IDs = value; } }

public List Cats { get { return _Cats; } set { _Cats = value; } }

// Constractor
public Person(string name, int age) {
Name = name;
Age = age;
}

public Person() { }


public void sleep() {
System.Console.WriteLine("Person of " + Name + " is sleeping.");
}
public void eat(){
System.Console.WriteLine("Person of " + Name + " is eating.");
}
public void read() {
System.Console.WriteLine("Person of " + Name + " is sleeping.");
}
}
}



Cat.cs

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace YamlTest {
public class Cat {

private int _Age = 3;

private string _Name = "";

public int Age {
get {
return _Age;
}
set {
_Age = value;
}
}

public string Name {
get {
return _Name;
}

set {
_Name = value;
}
}


public Cat(string name , int age) {
Name = name;
Age = age;
}

public Cat() { }

public void sleep() {
System.Console.WriteLine("Cat is sleeping.");
}

public void eat() {
System.Console.WriteLine("Cat is eating.");
}

}
}




Car.cs

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace YamlTest {
public class Car {

private string _Number;

private string _Name;

public string Number { get { return _Number; } set { _Number = value; } }

public string Name { get { return _Name; } set { _Name = value; } }


// コンストラクタを与えます。
public Car(string number) { Number = number; }

}
}



yamlだけで疲れてしまったので、jsonはまた今度。。。

-- 追記 --
jsonライブラリについての検討と検討結果について書きました。
[C#] Jsonライブラリの検討と設定ファイルの移行について





スポンサーサイト

テーマ : プログラミング
ジャンル : コンピュータ

コメントの投稿

非公開コメント

プロフィール

ss_9

名前 :ss_9
紹介 :
20代はエンジニア、30代はプロ、40代は管理、50代は人脈。

Twitterボタン

最新記事
カテゴリ
AD
月別アーカイブ
RSSリンクの表示
RSSリンクの表示
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。