16

Large, Complex Objects as a Web Service Resultに関する最近の質問の続きです。私は、将来のすべての子クラスが XML にシリアライズ可能であることを保証する方法について考えてきました。

さて、明らかにIXmlSerializableインターフェースを実装してからリーダー/ライターをそれにチャックすることができますが、それは、それをしたいときはいつでもリーダー/ライターをインスタンス化する必要があることを意味するため、99.99% の時間は避けたいと思います。文字列で作業するので、自分で書くだけです。

ただし、XML にシリアル化するには、クラスとそのメンバーをXml で装飾するだけですか??? 属性 ( XmlRootXmlElementなど) を作成し、それをXmlSerializerStringWriterに渡して文字列を取得します。これはすべて良いことです。文字列を返すメソッドを汎用ユーティリティ メソッドに入れるつもりなので、型などを気にする必要はありません。

私に関係するこれはこれです:クラスを必要な属性で装飾しないと、実行時までエラーはスローされません。

属性の装飾を強制する方法はありますか? これは FxCop で実行できますか? (私はまだ FxCop を使用していません)

アップデート:

やるべきことがたくさんあります。

FxCopに頼るのではなく、テストケースでリフレクションを使用するというアイデアが間違いなく好きです(すべてをまとめるのが好きです)。Fredrik Kalsethの答えは素晴らしかったです.コードを含めてくれてありがとう.自分でやり方を考えよう!

同様の提案については、他の人に+1してください:)

4

5 に答える 5

19

特定の基準に一致するクラス (つまり、X のサブクラス化) が適切に装飾されていることを検証する単体/統合テストを作成します。テストで実行するようにビルドを設定すると、このテストが失敗したときにビルドが失敗する可能性があります。

更新: 「袖をまくり上げて、単体テストがまとめて維持されていることを確認する必要があるようです」とあなたは言いました-そうする必要はありません。リフレクションを使用してアサートする必要があるすべてのクラスを見つける一般的なテスト クラスを作成するだけです。このようなもの:

[TestClass]
public class When_type_inherits_MyObject
{
    private readonly List<Type> _types = new List<Type>();

    public When_type_inherits_MyObject()
    {
        // lets find all types that inherit from MyObject, directly or indirectly
        foreach(Type type in typeof(MyObject).Assembly.GetTypes())
        {
            if(type.IsClass && typeof(MyObject).IsAssignableFrom(type))
            {
                _types.Add(type);
            }
        }
    }

    [TestMethod]
    public void Properties_have_XmlElement_attribute
    {
        foreach(Type type in _types)
        {
            foreach(PropertyInfo property in type.GetProperties())
            {
                object[] attribs = property.GetCustomAttributes(typeof(XmlElementAttribute), false);
                Assert.IsTrue(attribs.Count > 0, "Missing XmlElementAttribute on property " + property.Name + " in type " + type.FullName);
            }
        }
    }
}
于 2008-08-21T07:54:12.670 に答える
1

基本クラスのコンストラクターで GetType() を呼び出し、返された型を反映することで、FxCop ルールを記述したり、属性を確認したりすることもできます。

于 2008-08-21T10:08:08.840 に答える
1

この種のものをチェックする単体テストを書くことができます - それは基本的にリフレクションを使用します。

これが可能であるという事実を考えると、FxCop ルールを作成することも可能だと思いますが、私はそのようなことをしたことがありません。

于 2008-08-21T08:17:30.540 に答える
0

適切な FXCop ルール (および私が現在必要としているルール) は、ASP.NET セッションに追加されているすべてのオブジェクトが Serializable 属性を持っていることを確認することです。InProc セッション状態から SQL Server に移行しようとしています。初めてページをリクエストしたとき、シリアル化できないオブジェクトがセッションに保存されていたため、サイトが爆発しました。次に、セッションでオブジェクトが設定されているすべてのインスタンスを探して、すべてのソース コードを探し出す作業が行われました... FXCop は優れたソリューションです。取り組むべきこと...

于 2008-10-03T22:11:53.647 に答える
0

この概念/ポストプロセッサを使用して、属性間の関係を強制し、同様のログインを使用して、コンパイル時にクラスと属性間の関係を強制することもできます。

http://www.st.informatik.tu-darmstadt.de/database/publications/data/cepa-mezini-gpce04.pdf?id=92

于 2009-03-06T05:18:16.587 に答える