无法序列化会话状态... [已更新!]

Pau*_*aul 8 c# asp.net serialization

我试图在会话中存储一些对象(使用StateServer),但是我收到错误"System.Web.HttpException:无法序列化会话状态.在'StateServer'和'SQLServer'模式下"

我知道错误信息的含义,但我无法理解为什么.我使用的所有类都标记为Serializable,我可以使用以下命令对对象进行序列化和反序列化:

System.IO.StringReader stringReader = new System.IO.StringReader(xml);
System.Xml.XmlTextReader xmlTextReader = new System.Xml.XmlTextReader(stringReader);
System.Xml.Serialization.XmlSerializer xmlSerializer = new System.Xml.Serialization.XmlSerializer(typeof(Parts));
Parts obj = ((Parts)(xmlSerializer.Deserialize(xmlTextReader)));
Run Code Online (Sandbox Code Playgroud)

这有效,并将使用以下序列化:

System.Xml.Serialization.XmlSerializer xmlSerializer = new System.Xml.Serialization.XmlSerializer(this.GetType());
System.IO.MemoryStream memoryStream = new System.IO.MemoryStream();
xmlSerializer.Serialize(memoryStream, this);
memoryStream.Seek(0, System.IO.SeekOrigin.Begin);
System.IO.StreamReader streamReader = new System.IO.StreamReader(memoryStream);
return streamReader.ReadToEnd();
Run Code Online (Sandbox Code Playgroud)

但是在尝试将其存储在Session中时会抛出错误.

有没有人有任何想法可能导致这种行为?

编辑:

我刚刚发现这一行导致了错误(删除了所有内容并重新包含它)

/// <remarks/>
[System.Xml.Serialization.XmlElementAttribute("RecordReference", typeof(RecordReference), Form = System.Xml.Schema.XmlSchemaForm.Unqualified, Order = 0)]
[System.Xml.Serialization.XmlElementAttribute("PartContainer", typeof(PartContainer), Form = System.Xml.Schema.XmlSchemaForm.Unqualified, Order = 0)]
public object Item
{
    get
    {
        return this.itemField;
    }
    set
    {
        this.itemField = value;
    }
}
Run Code Online (Sandbox Code Playgroud)

如果我将此"Item"属性设置为"new RecordReference()",则会发生错误.如果它为null,那很好.

所以现在,问题是,为什么StateServer不能应对这个?序列化为XML时序列化很好......

编辑...

在Assembly'System.Xml,Version = 2.0.0.0,Culture = neutral,PublicKeyToken = b77a5c561934e089'中键入'System.Xml.XmlElement'未标记为可序列化.

.....我们是说C#中的Xml对象不可序列化吗?!还有其他人认为这是疯了吗?

ste*_*son 9

在堆栈跟踪中,您应该看到一个SerializationException,它将提到它无法序列化的类...

[SerializationException: Type 'SomethingOrOther' in Assembly 'SomethingElse' ...
Run Code Online (Sandbox Code Playgroud)

请注意,状态服务器使用二进制序列化而不是XML序列化.


Pau*_*aul 6

所以我找到了问题的答案,但我对此并不满意.

基本上,我正在使用的一些类包含XMLElements和XMLNodes(它们是使用svcutil自动生成的).无论出于何种原因,它认为它需要它们.

这些XML类都不是可序列化的!我是唯一一个发现这完全失败的人吗?因此,要将这组类添加到会话中,我必须将它们序列化为字符串,然后将其存储在会话中,然后将其序列化.所以我将它序列化以便将其序列化.....!

不确定我对此很满意,但那是我遇到问题的原因.

  • 只是想说我发现你对这个问题的愤怒是合理的(我同意你的观点)和有趣的 - 当我读到它时,它在我的脸上露出了笑容.大声笑 (3认同)