C# 我应该如何序列化一些简单的审计数据以存储在SQL表中?

C# 我应该如何序列化一些简单的审计数据以存储在SQL表中?,c#,serialization,C#,Serialization,我在SQL server中有一个审计表。记录每个高级用户操作的条目,例如更新记录、添加新记录、删除记录等 我有一个检测和记录所有更改的机制(在.NET中,而不是作为数据库中的触发器),并且有一个记录字段名、以前的值和新值的对象集合。我希望将字段更改存储在同一个表中(而不是单独的表中,也就是说,我不希望对此进行全面的规范化关系设计),因此我有一个blob字段(也可以是字符字段),我希望在其中记录字段级审核数据 我想我只是想获取我的对象图(基本上只是这些字段更改对象的列表)并将其序列化,然后将序列化

我在SQL server中有一个审计表。记录每个高级用户操作的条目,例如更新记录、添加新记录、删除记录等

我有一个检测和记录所有更改的机制(在.NET中,而不是作为数据库中的触发器),并且有一个记录字段名、以前的值和新值的对象集合。我希望将字段更改存储在同一个表中(而不是单独的表中,也就是说,我不希望对此进行全面的规范化关系设计),因此我有一个blob字段(也可以是字符字段),我希望在其中记录字段级审核数据

我想我只是想获取我的对象图(基本上只是这些字段更改对象的列表)并将其序列化,然后将序列化的版本存储在表中

稍后,当用户想要查看更改时,我可以反序列化字段并重建字段更改集合


那么,在.NET3.5中最好使用什么样的框架/序列化格式呢?我不太在意对象的大小,它也不必是人类可读的。

要序列化对象,您需要使用[Serializable]属性标记对象类,或者实现ISerializable接口,即

 [Serializable]
 public class MySerializableClass
 {
   ...
 }

}


还可以看看在哪里可以选择要将对象序列化到的数据类型。

我可能会使用xml,尽管二进制文件对于大小/性能来说是最好的


有了xml,您仍然可以使用SQL查询数据,而不必太担心对象的版本控制。如果使用二进制,则必须考虑版本控制,以防对象发生变化。

< P>避免长期存储(例如在数据库中)的<代码> BinaryFormatter <代码>;因为它包含类型/程序集元数据,您很容易发现以后无法反序列化数据。另外,它是特定于.NET的!所以,如果你想从其他平台阅读它,你就有点泄气了

JSON(通过JSON.NET)将成为一种简单、可读性好、占用空间小的格式。通过
XmlSerializer
DataContractSerializer
生成Xml是可以的,但可读性较差。如果您最关心的是空间,那么可能是“协议缓冲区”(protobuf net和其他)之类的东西—如果没有支持的实用程序dll,几乎不可能读取,但是非常快速和高效


我个人很想使用JSON。这意味着我可以在SSMS中读取审计…

BinaryFormatter对于长期存储来说可能有风险。有很多方法可以永久地打破这一局面。。。
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
    }