Jos*_*ker 3 asp.net session session-state protocol-buffers protobuf-net
我一直在考虑优化SQL Server内会话的状态存储的方法,我遇到的几种方法是:
现在,我在会话中存储了一个对象(称为SessionObject的类)。好消息是,它是完全可序列化的。
我认为另一种优化会话存储的好方法可能是使用协议缓冲区(protobuf-net)序列化/反序列化而不是标准BinaryFormatter。我知道我可以让所有对象继承ISerializable,但是我不想创建DTO或使用序列化/反序列化逻辑使我的Domain层混乱。
将protobuf-net与会话状态SQL Server模式一起使用的任何建议都很棒!
如果现有的会话状态代码使用BinaryFormatter
,那么您可以通过仅在您的根对象上BinaryFormatter
实现protobuf-net作为其内部代理来作弊:ISerializable
[ProtoContract]
class SessionObject : ISerializable {
public SessionObject() { }
protected SessionObject(SerializationInfo info, StreamingContext context) {
Serializer.Merge(info, this);
}
void ISerializable.GetObjectData(SerializationInfo info, StreamingContext context) {
Serializer.Serialize(info, this);
}
[ProtoMember(1)]
public string Foo { get; set; }
...
}
Run Code Online (Sandbox Code Playgroud)
笔记:
如果要从根对象中删除类型元数据,则必须实现自己的状态提供程序(我认为MSDN上有一个示例);因此,
ISerializable
在根对象上实现(以上提出的所有其他观点仍然适用)
还请注意,此处的protobuf-net的有效性将在某种程度上取决于您要存储的数据。它应该更小,但是如果您有很多巨大的字符串,它就不会更小,因为protobuf仍然使用UTF-8作为字符串。
如果您确实有很多字符串,则可以考虑另外使用gzip-我为最后一个尝试gzip的雇主编写了一个状态提供程序,并存储了最小的那个(原始的或gzip的)(显然有一些检查),例如:
上面的代码可以很高兴地与protobuf-net 结合使用-如果您正在编写状态提供程序,则可以删除ISerializable
etc以实现最佳性能。
如果您确实想要的话,最后一个选择就是将“压缩模式”属性添加到[ProtoContract(..., CompressionMode = ...)]
;哪一个:
ISerializable
用法(出于技术原因,更改主要布局没有任何意义,但是这种情况很好)但是,这是我只想真正申请“ v2”的东西(我对v1中的错误修正非常残酷,这样我才能保持理智)。
让我知道是否有兴趣。
归档时间: |
|
查看次数: |
1624 次 |
最近记录: |