Из того, что я прочитал, класс LosFormatter, используемый для сериализации ViewState, проверяет, существует ли TypeConverter для данного объекта, и использует его, поэтому вам следует ознакомиться с ним.
Эта статья описывает, как создать свой собственный JavaScriptConverter для выполнения настраиваемой сериализации.Метод Serialize, который вы должны реализовать, возвращает IDictionary<string, object>
, поэтому вам, возможно, придется создать класс JavaScriptConverter для вашего класса Entity, а не для вашей структуры IdType.Ниже приведен пример, хотя у меня не было возможности проверить его:
Примечание: примеры в моем посте просто ищут связанный TypeConverter для IdType, чтобы преобразовать его в строку, но еслиесть конкретная причина сделать это таким образом, что вы можете просто вызвать определенную функцию (например, переопределить ToString), которая возвращает строковое представление напрямую, а не искать TypeConverter, как это делает мой пример кода.
public class EntityJsonConverter : System.Web.Script.Serialization.JavaScriptConverter
{
public override object Deserialize(IDictionary<string, object> dictionary, Type type, JavaScriptSerializer serializer)
{
throw new NotImplementedException();
}
public override IDictionary<string, object> Serialize(object obj, JavaScriptSerializer serializer)
{
if (obj == null)
throw new ArgumentNullException("obj");
Entity entity = obj as Entity;
if (entity != null)
{
var values = new Dictionary<string, object>();
TypeConverter idTypeConverter = TypeDescriptor.GetConverter(entity.Id);
if (idTypeConverter != null)
{
if (idTypeConverter.CanConvertTo(typeof(string)))
values.Add("Id", idTypeConverter.ConvertTo(entity.Id, typeof(string)));
else
throw new SerializationException(string.Format("The TypeConverter for type \"{0}\" cannot convert to string.", this.GetType().FullName));
}
else
throw new SerializationException(string.Format("Unable to find a TypeConverter for type \"{0}\".", this.GetType().FullName));
values.Add("Data", serializer.Serialize(entity.Data));
return values;
}
else
throw new ArgumentException(string.Format("Expected argument of type \"{0}\", but received \"{1}\".", typeof(Entity).FullName, obj.GetType().FullName), "obj");
}
public override IEnumerable<Type> SupportedTypes
{
get { yield return typeof(Entity); }
}
}
Если вы также хотите, чтобы поведение, которое вы описали для сериализации XML, могло бы иметь структуру IdType, реализующую интерфейс IXmlSerializable.Ниже приведен пример реализации метода WriteXml, который использует TypeConverter, определенный для структуры IdType:
void IXmlSerializable.WriteXml(System.Xml.XmlWriter writer)
{
TypeConverter converter = TypeDescriptor.GetConverter(this);
if (converter != null)
{
if (converter.CanConvertTo(typeof(string)))
writer.WriteString(converter.ConvertTo(this, typeof(string)) as string);
else
throw new SerializationException(string.Format("The TypeConverter for type \"{0}\" cannot convert to string.", this.GetType().FullName));
}
else
throw new SerializationException(string.Format("Unable to find a TypeConverter for type \"{0}\".", this.GetType().FullName));
}