如何防止类中的属性不存储在会话中

时间:2014-03-27 11:14:29

标签: .net asp.net-mvc asp.net-mvc-3 asp.net-mvc-4

假设我有复杂的课程

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;}

请帮助我。

2 个答案:

答案 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);
    }
}