Я пытаюсь сериализовать объекты класса Reference
в конце моей программы.Выдается исключение сериализации, которое жалуется на то, что «DataAnalysis.Reference + <> c__DisplayClass4» не помечен как сериализуемый.
Изначально у меня было два делегата без атрибута Serializable
, поэтому я попробовал, но это ничего не изменило.Классы Cacheable
и Operation
уже помечены как Serializable
- и на самом деле сериализация их обоих прекрасно работала до того, как я ввел класс Reference
.
Я даже не знаюзнать, что означает c__DisplayClass4.Поэтому я прошу прощения, но я не знаю, какие другие части моего 1-мегабайта + исходный код размещать здесь, чтобы помочь вам решить проблему, потому что в конце я буду публиковать все.
Как я уже сказал,все работало нормально до введения класса Reference
.Поэтому я надеюсь, что проблема каким-то образом локализована.
using System;
using System.Reflection;
namespace DataAnalysis
{
/// <summary>
/// Description of Reference.
/// </summary>
[Serializable]
public class Reference
{
[Serializable]
public delegate void ReferenceSetter(Operation op, Cacheable c);
[Serializable]
public delegate Cacheable ReferenceGetter(Operation op);
readonly ReferenceGetter refGetter;
readonly ReferenceSetter refSetter;
public Reference(ReferenceGetter getter, ReferenceSetter setter)
{
refGetter = getter;
refSetter = setter;
}
public Reference(FieldInfo operationField)
{
refGetter = (op => (Cacheable)operationField.GetValue(op));
refSetter = ((op, value) => operationField.SetValue(op, value));
}
public Cacheable this[Operation op]
{
get {return refGetter(op);}
set {refSetter(op, value);}
}
}
}
Редактировать: Я выбрал первое решение для таффера (избегайте использования FieldInfo внутри делегата):
public class Reference
{
public delegate void ReferenceSetter(Operation op, Cacheable c);
public delegate Cacheable ReferenceGetter(Operation op);
readonly FieldInfo opField;
readonly ReferenceGetter refGetter;
readonly ReferenceSetter refSetter;
public Reference(ReferenceGetter getter, ReferenceSetter setter)
{
refGetter = getter;
refSetter = setter;
}
public Reference(FieldInfo operationField)
{
opField = operationField;
}
public Cacheable this[Operation op]
{
get
{
if (opField != null) return (Cacheable)opField.GetValue(op);
else return refGetter(op);
}
set
{
if (opField != null) opField.SetValue(op, value);
else refSetter(op, value);
}
}
}
Пока не отточено, я, вероятно, наконец-то буду использовать абстрактный класс Reference
с двумя реализациями.Но принцип становится понятным.