4

次のようなモデルがあります。

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

次に、これを EnyimMemcached を使用して memcached にキャッシュしようとしています。

例外はスローされませんが、アイテムは保存されません。
私はこれを、私の TemplatePageModel クラスがシリアライズ可能ではないという事実まで追跡しました。

私はこの小さなスニペットでこれをテストしました:

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

私のIEnumerableプロパティについて不平を言っています。

実際のエラー メッセージは次のとおりです。

「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]]' アセンブリ 'System.Core、Version=4.0.0.0、Culture=neutral、PublicKeyToken=b77a5c561934e089' は、シリアル化可能としてマークされていません。

どうすればこれを回避できますか?

最初にjsonにシリアル化する必要がなく、可能であれば途中で逆シリアル化する必要がないことを望んでいました....

4

1 に答える 1

6

BinaryFormatterフィールドレベルのシリアライザーです。何かがetcであるかどうかは気にしません。「ここにある実際のオブジェクトは何ですか?シリアライズできますか? IEnumerable」だけを気にします。たとえば、配列またはリストは一般にシリアライズ可能です。一部のカスタム遅延シーケンス (フィルター処理された LINQ 式など) は、シリアル化できない可能性があります。

おそらくもっと簡単なオプション: 複雑な式をシリアル化しようとしないでください。したがって、代わりに:

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

行う:

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

配列 (またはリスト) は単純で、簡単にシリアル化できます。

于 2012-07-03T12:54:34.123 に答える