4 Stimmen

Serialisierung von Klassen mit IEnumerables - zur Verwendung mit Enyim Memcached

Ich habe ein Modell, das so aussieht:

[Serializable]
public class TemplatePageModel
{
    public PageModel Page { get; set; }
    public SidebarModel Sidebar { get; set; }
}

[Serializable]
public class PageModel
{
    public IEnumerable<SectionModel> Section { get; set; }
}

[Serializable]
public class SidebarModel
{
    public IEnumerable<ControlModel> Control { get; set; }
}

[Serializable]
public class SectionModel
{
    public string Order { get; set; }

    public string Editable { get; set; }

    public string Column { get; set; }

    public string Text { get; set; }
}

Ich versuche dann, dies in memcached mit EnyimMemcached zwischenzuspeichern.

Es werden keine Ausnahmen ausgelöst, aber das Objekt wird nicht gespeichert.
Ich habe dies auf die Tatsache zurückgeführt, dass meine TemplatePageModel-Klasse nicht serialisierbar ist.

Ich habe dies mit diesem kleinen Schnipsel getestet:

MemoryStream mem = new MemoryStream();
BinaryFormatter b = new BinaryFormatter();
try
{
    b.Serialize(mem, result);
}
catch (Exception ex)
{
    //EXCEPTION HERE
}

Es beschwert sich über meine IEnumerable-Eigenschaften.

Die eigentliche Fehlermeldung lautet:

Typ System.Linq.Enumerable+WhereSelectEnumerableIterator`2[[System.Xml.Linq.XElement, System.Xml.Linq, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089],[Desktop.Service.Model.ControlModel, Dekstop.Service, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null]]' in Assembly 'System.Core, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089' ist nicht als serialisierbar.

Wie kann ich das umgehen?

Ich hatte gehofft, nicht zu müssen, serialisieren in Json erste, und de-serialisieren auf dem Weg aus, wenn möglich....

6voto

Marc Gravell Punkte 970173

BinaryFormatter ist ein Serialisierer auf Feldebene. Er kümmert sich nicht darum, ob etwas IEnumerable usw. Sie kümmert sich nur darum: "Was ist die aktuell Objekt hier? kann ich es serialisieren?". Zum Beispiel ist ein Array oder eine Liste im Allgemeinen serialisierbar. Eine benutzerdefinierte latente Sequenz (vielleicht ein gefilterter LINQ-Ausdruck) ist potenziell pas serialisierbar.

Vielleicht eine noch einfachere Option: versuchen Sie nicht, komplexe Ausdrücke zu serialisieren. Also anstelle von:

obj.Controls = someQuery.Where(x => whatever).OrderBy(x => x.Foo);

tun:

obj.Controls = someQuery.Where(x => whatever).OrderBy(x => x.Foo).ToArray();

Ein Array (oder eine Liste) ist einfach und trivial serialisierbar.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X