十一月 20, 2009

以二进制方式存储对象到数据库

Written by

 

=================================================
本文为khler原作,转载必须确保本文完整并完整保留原作者信息及本文原始链接
E-mail: khler@163.com
QQ:     23381103
MSN:   pragmac@hotmail.com
=================================================

 

     
C#开发中,往往将一个对象的所有属性映射为数据库中的一张表,每个属性对应表里面的每个字段,这个对象的属性大部分是string、int、double等基础类型,当然也有很多是复杂类型对象,我们往往会将这个复杂类对象的所有属性映射为另一张表进行存储。有时候为了简单起见,我们可以把这个复杂类对象的属性映射为表里面的二进制字段进行存储,避免了新建表及关连查询的一大堆繁琐事务。

 

具体实现如下:

有一个类Person:

 

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data;
using System.IO;
using System.Runtime.Serialization;
using System.Runtime.Serialization.Formatters;
using System.Runtime.Serialization.Formatters.Binary;

namespace TestBinaryObjectSerializedIntoDatabase
{
    
public class Person
    {
        
private Guid id = Guid.NewGuid();
        
private string name;
        
private double height;
        
private Pet pet;

        /// <summary>
        
/// Id
        
/// </summary>
        public Guid Id
        {
            
get { return id; }
            
set { id = value; }
        }

        /// <summary>
        
/// 名字
        
/// </summary>
        public string Name
        {
            
get { return name; }
            
set { name = value; }
        }

        /// <summary>
        
/// 身高
        
/// </summary>
        public double Height
        {
            
get { return height; }
            
set { height = value; }
        }

        /// <summary>
        
/// 宠物
        
/// </summary>
        public Pet MyPet
        {
            
get { return pet; }
            
set { pet = value; }
        }
    }
}

 

 

 其中宠物MyPet属性就是一个复杂类:

 

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

namespace TestBinaryObjectSerializedIntoDatabase
{
    [Serializable()]
    
public class Pet
    {
        
private Guid id = Guid.NewGuid();
        
private string name;
        
private double weight;

        /// <summary>
        
/// 构造函数
        
/// </summary>
        
/// <param name=”id”></param>
        public Pet(Guid id, string name)
        {
            
this.id = id;
            
this.name = name;
        }

        /// <summary>
        
/// Id
        
/// </summary>
        public Guid Id
        {
            
get { return id; }
        }
        
/// <summary>
        
/// 名字
        
/// </summary>
        public string Name
        {
            
get { return name; }
            
set { name = value; }
        }
        
/// <summary>
        
/// 体重
        
/// </summary>
        public double Weight
        {
            
get { return weight; }
            
set { weight = value; }
        }
    }
}

 

       为了简单说明存储机制,我做了一个例子(从这里下载示例代码),通过DataSet将数据保存到数据库中,并且系列化成了一个xml文件。要打开此示例,你必须具有VS2008或以上版本,要运行此示例,你必须安装.net3.5。

 

示例中,我将对象以二进制方式存到了Person表中的Pet字段:

 

                // 本例关键:从数据库中读取二进制数据并转换为对象
                MemoryStream stream = new MemoryStream((byte[])dr[Pet]);
                IFormatter formatter 
= new BinaryFormatter();
                pet 
= (Pet)formatter.Deserialize(stream);

 

读取时:

 

            // 本例关键:将对象系列化为二进制流并保存到数据库
            MemoryStream stream = new MemoryStream();
            IFormatter formatter 
= new BinaryFormatter();
            formatter.Serialize(stream, pet);
            dr[
Pet= stream.GetBuffer();

 

   
本文中的示例也同时实现了数据的xml存储机制,对于小型项目,可以通过DataSet管理数据库并存储为xml文件,简单、方便、快捷、小巧,非常实用。

 

 

Category : Linux/UnixWindow$其他

Tags :

发表评论

电子邮件地址不会被公开。

Proudly powered by WordPress and Sweet Tech Theme