He,YuanHui —— 业精于勤荒于嬉,行成于思毁于随

如果你喜欢一个事,又有这样的才干,那就把整个人都投入进去,就要象一把刀直扎下去直到刀柄一样,不要问为什么,也不要管会碰到什么。

  博客园 :: 首页 :: 博问 :: 闪存 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::

 

=================================================
本文为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文件,简单、方便、快捷、小巧,非常实用。

 

 

posted on 2009-11-20 13:31  He,YuanHui  阅读(3573)  评论(8编辑  收藏  举报

Add to Google