2009-07-17 1 views
0

SQLサーバーに監査テーブルがあります。これは、高レベルの各ユーザアクションに対するエントリを記録することである。レコードを更新する、新しいレコードを追加する、レコードを削除するなどSQLテーブルに格納するための簡単な監査データをシリアル化するにはどうすればよいですか?

私は、すべての変更(.NETではデータベース内のトリガーではない)を検出して記録するメカニズムを備えています。フィールド名、前の値、新しい値を記録します。私はフィールドの変更を同じテーブルに保存したい(別のテーブルではない、つまりこれに対して本格的な正規化されたリレーショナルデザインを望んでいない)ので、ブロブフィールドを持つフィールドレベルの監査データを記録したいと考えています。

私はオブジェクトグラフ(基本的にはこれらのフィールド変更オブジェクトの一覧)を取り込み、それをシリアル化してシリアル化バージョンテーブルに

後で、ユーザーが変更を表示したいときに、フィールドを逆シリアル化してフィールド変更のコレクションを再構築できます。

.NET 3.5で使用するには、最高のフレームワーク/シリアル化フォーマットは何でしょうか?私はサイズについてあまり気にしないし、人間が読めるものである必要はありません。オブジェクトをシリアル化するために

答えて

4

BinaryFormatter(データベースなど)に長期保存するものは避けてください。タイプ/アセンブリメタデータが含まれているため、後でデータを逆シリアル化できないことが簡単にわかります。さらに、.NET固有のものです!他のどのプラットフォームからでも読んでみたいと思ったら、ちょっと怖いですね。

JSON(via Json.NET)は、シンプルでわかりやすい読みやすい形式で、あまりスペースをとらないでしょう。 XmlSerializerまたはDataContractSerializer経由のXmlは問題ありませんが、としてはと表示されません。もしスペースがあなたの最大の懸念事項であれば、おそらく "プロトコルバッファ"(protobuf-netなど)のようなものです。サポートユーティリティdllなしで読むのは事実上不可能ですが、非常に速く効率的です。

個人的にJSONを使用するように誘惑されます。これは、私がSSMSで監査を読むことができることを意味します。

2

、あなたは[Serializableを]属性を持つオブジェクトクラスをマークするか、また、インタフェースすなわち

[Serializable] 
public class MySerializableClass 
{ 
    ... 
} 

または

using System.Runtime.Serialization; 

public class MySerializableClass : ISerializable 
{ 
    SerializationInfo info; 
    StreamingContext context; 

    public void GetObjectData(SerializationInfo info, StreamingContext context) 
    { 
     this.info = info; 
     this.context = context; 

     // implementation code goes here 
    } 

}

をISerializableを実装するいずれかの必要がありますIFormatterを見てください。そこでは、オブジェクトをシリアル化するデータ型を選択できます。

+1

BinaryFormatterは間違いなく長期保存にとって危険です。これを永久に破る多くの方法があります... –

1

バイナリはサイズ/パフォーマンスに最適ですが、おそらくxmlを使用します。

xmlでは、データを照会するのにSQLを使用することができ、オブジェクトのバージョン管理についてあまり心配する必要はありません。バイナリを使用する場合は、オブジェクトが変更された場合のバージョニングを考慮する必要があります。

関連する問題