假设我有复杂的课程
class Complex
{
public ClassA A { get; set;}
public ClassB B { get; set;}
public string prop1 { get; set;}
public string prop2 { get; set;}
}
现在我想将此对象存储在会话中。我可以用以下陈述来做。
var complexObj = new Complex {
// Initialize the proerties here.
}
Session["ComplexObj"] = complexObj;
现在,我不想在会话中存储类A
对象(因为我们不在任何地方管理此值。)。任何人都可以告诉我如何在不改变现有课程的情况下做到。
我们可以为该特定属性提供类似data annotations
的内容吗?
像这样的东西
[NoSession]
public ClassA A { get; set;}
请帮助我。
答案 0 :(得分:1)
您必须使用NonSerialized属性,但不要创建自动属性。声明一个私有变量并使其成为NonSerialized并在公共属性中使用它..旧方式..
[非序列化]
private#dataType#_obj;public#dataType#Obj { 得到{return _obj; } 设置{_obj = value; } }
答案 1 :(得分:0)
没有办法,如果你将null
设置为A属性,样本会更好:
public Complex MyComplex
{
get
{
return Session["ComplexObj"] as Complex
}
set
{
value.A = null; // set A to null
Session["ComplexObj"] = value;
}
}
另一方面,您可以将对象序列化为Stream
并将此对象应用于会话,但是您应该反序列化以进行读取(在这种情况下,您可以应用NonSerialized
属性来忽略对于序列化过程的属性,对于样本:
在Complex
课程中,您可以为不想序列化的媒体添加NonSerialized
属性:
class Complex
{
[NonSerialized]
public ClassA A { get; set;}
public ClassB B { get; set;}
public string prop1 { get; set;}
public string prop2 { get; set;}
}
实现一些序列化辅助方法到serializa到Memorystream
public static MemoryStream SerializeToStream<T>(T o)
{
MemoryStream stream = new MemoryStream();
IFormatter formatter = new BinaryFormatter();
formatter.Serialize(stream, o);
return stream;
}
public static T DeserializeFromStream<T>(MemoryStream stream)
{
IFormatter formatter = new BinaryFormatter();
stream.Seek(0, SeekOrigin.Begin);
T o = (T)formatter.Deserialize(stream);
return o;
}
使用辅助方法创建一个封装Complex
对象的属性。
public Complex MyComplex
{
get
{
if (Session["ComplexObj"] != null)
{
return DeserializeFromStream<MyComplex>((MemoryStream)Session["ComplexObj"]);
}
return null;
}
set
{
Session["ComplexObj"] = SerializeToStream(value);
}
}