CommunityServer中广泛应用了一种对象持久化的机制, 这种机制和.Net2.0中的Profile是相同的原理,把对象序列化为一个字符串保存到数据库的一个字段中,同时使用另一个字段保存对象所在字符串的位置,看看一个例子:
[PropertyNames]字段的值:
EnableAllPreview:S:0:5:EnablePreviewResumeAttachment:S:5:4:EnablePreviewBaseInfo:S:9:4:EnablePreviewDetailInfo:S:13:4:EnablePreviewJobExp:S:17:5:EnablePreviewEduExp:S:22:5:EnablePreviewUserSkill:S:27:5:EnablePreviewUserLanguage:S:32:5:EnablePreviewCertificate:S:37:5:EnablePreviewAdvUser:S:42:5:EnablePreviewTrainingExperience:S:47:5:EnablePreviewProjectExperience:S:52:5:
[PropertyValues]字段的值:
FalseTrueTrueTrueFalseFalseFalseFalseFalseFalseFalseFalse
上面代码中的"S:0:5"表示了对象在字符串中的位置和类型
"S"表示这个对象是一个字符串
"0"表示这个对象在字符串中开始的索引
"5"表示这个对象的长度
根据这些信息,程序或都SQL代码都可以提取出所需要的对象,例如:
EnableAllPreview:S:0:5: 表示EnableAllPreview表示这个对象保存在[PropertyValues]中是一个字符串的形式,并且它的开始位置是从0开始,长度为5个字符,根据这样的条件可以得到对象的值是False
CommunityServer内部已经封装好了一些方法用于方便使用这样的持久化机制.
1.为想使用这种持久化机制的表添加两个字段:
ALTER TABLE Job_ResumeState ADD PropertyNames ntext NULL
ALTER TABLE Job_ResumeState ADD PropertyValues ntext NULL
2.表对应的对象继承于ExtendedAttributes对象,对象中封装了一些方法,让你可以非常方便的添加扩展属性.
[Serializable]
public class ExtendedAttributes
}
其中的public SerializerData GetSerializerData()和public void SetSerializerData(SerializerData data)用于获取和添加序列化数据时使用,在下面的例子中会有更详细的讨论,而其它方法都是为了方便从序列化中获取或者设置对象的助手方法.
看一下继承于此扩展属性类的类:
[Serializable]
public class ResumeState : ExtendedAttributes
}
其中的EnableAllPreview和EnablePreviewBaseInfo属性就是一个扩展属性,这属性是使用序列化的机制进行保存的,它伴随着对象进行获取,添加,更新,删除,只要框架定好了添加一个新的扩展属性并不需要任何数据库操作就能够快速的实现.
3.扩展属性是如何加载到对象的,这里看一段代码从数据库返回的IDataReader填充对象的操作:
public static ResumeState PopulateResumeStateFromIDataReader(IDataReader dr)
}
SerializerData data = new SerializerData(); 是用来保存对象名值对的自定义对象
public class SerializerData
}
事实上对象的提取就是根据键值进行提取的,这个对象会在state.SetSerializerData(data);方法中填充并反序列化到一个NameValueCollection对象中,这个对象就是保存在ExtendedAttributes类中的NameValueCollection extendedAttributes
有了这个NameValueCollection后就可以根据键来得到其相应的值,例如:
get { return GetBool("EnableAllPreview", false); }就可以获取EnableAllPreview属性的值
4.扩展属性如何保存到数据库字段中?
public override int InsertResumeState(ResumeState resumeState)
}
如上例子,在添加一新简历状态时只需要使用封装好的方法获取当前对象的扩展属性的SerializerData对象
SerializerData data = resumeState.GetSerializerData();
因为ResumeState是继承于ExtendedAttributes属性的,所以可以直接使用GetSerializerData()方法序列化出一个含有扩展属性的序列化字符串,从而可以保存到数据库:
db.AddInParameter(dbCommand, "@PropertyNames", DbType.String, data.Keys);
db.AddInParameter(dbCommand, "@PropertyValues", DbType.String, data.Values);
最后贴上一个封装好的序列化和反序化方法:
![]()
}
相关文章: