是的,C# 的 JavaScriptSerializer
类支持自定义类型。但是,为了使自定义类型能够被序列化和反序列化,你需要实现 ISerializable
接口,并定义 SerializeObject
和 DeserializeObject
方法。
以下是一个简单的示例,展示了如何为自定义类型实现 ISerializable
接口:
using System;
using System.Web.Script.Serialization;
public class CustomType : ISerializable
{
public int Id { get; set; }
public string Name { get; set; }
// 实现 ISerializable 接口的 SerializeObject 方法
public void SerializeObject(JavaScriptSerializer serializer)
{
serializer.RegisterConverters(new JavaScriptConverter[] { new CustomTypeJavaScriptConverter() });
serializer.Serialize(this, typeof(CustomType));
}
// 实现 ISerializable 接口的 DeserializeObject 方法
public static CustomType DeserializeObject(JavaScriptSerializer serializer, object obj)
{
return (CustomType)serializer.DeserializeObject(obj.ToString(), typeof(CustomType));
}
}
public class CustomTypeJavaScriptConverter : JavaScriptConverter
{
public override object Deserialize(IDictionary<string, object> dictionary, Type type, JavaScriptSerializer serializer)
{
throw new NotImplementedException();
}
public override IEnumerable<Type> SupportedTypes
{
get { return new[] { typeof(CustomType) }; }
}
public override IDictionary<string, object> Serialize(object obj, JavaScriptSerializer serializer)
{
var customType = (CustomType)obj;
var dictionary = new Dictionary<string, object>
{
{ "Id", customType.Id },
{ "Name", customType.Name }
};
return dictionary;
}
}
在这个示例中,我们创建了一个名为 CustomType
的自定义类型,并实现了 ISerializable
接口。我们还创建了一个名为 CustomTypeJavaScriptConverter
的自定义 JavaScript 转换器,用于处理 CustomType
类型的序列化和反序列化。
现在,你可以使用 JavaScriptSerializer
类来序列化和反序列化 CustomType
类型的对象:
var serializer = new JavaScriptSerializer();
// 创建一个 CustomType 对象
var customType = new CustomType { Id = 1, Name = "John Doe" };
// 序列化 CustomType 对象
customType.SerializeObject(serializer);
// 反序列化 CustomType 对象
var deserializedCustomType = CustomType.DeserializeObject(serializer, serializer.Parse(customType.SerializeObject(serializer).ToString()));