我正在尝试将[Serializable]属性与PetaPoco实体一起使用,以便将其存储在REDIS缓存中。
将[Serializable]属性添加到PetaPoca Entity类可以使用REDIS缓存提供程序对其进行缓存,但随后会更改WebAPI将实体序列化为JSON的方式,这会中断。
有没有一种方法可以指定WebAPI如何将对象序列化为JSON?
以下示例中,具体情况在DNN的DAL2范围内,并使用https://github.com/davidjrh/dnn.rediscachingproviderDNN的REDIS缓存提供程序。
DNN DAL2/PetaPoco对象:
[TableName("sbCurrencyRates")]
//setup the primary key for table
[PrimaryKey("CurrID", AutoIncrement = true)]
//configure caching using PetaPoco
[Cacheable("sbCurrencyRates", CacheItemPriority.Default, 20)]
//scope the objects to the ModuleId of a module on a page (or copy of a module on a page)
[Serializable]
public class CurrRateInfo
{
public int CurrID { get; set; }
public string CurrCode { get; set; }
public double CurrRate { get; set; }
public DateTime LastUpdate { get; set; }
}
WebApi控制器:
public class RatesController : DnnApiController
{
[AllowAnonymous]
[HttpGet]
public HttpResponseMessage GetRates()
{
CurrRatesController crc = new CurrRatesController();
return Request.CreateResponse(HttpStatusCode.OK, crc.Get());
}
}
提前谢谢。
假设您使用的是asp.net-web-api的最新版本,那么Json.net序列化程序将用于序列化您的类。默认情况下,Json.NET会忽略[Serializable]
,但也可以通过将DefaultContractResolver
上的IgnoreSerializableAttribute
设置为false
,强制它以与BinaryFormatter
相同的方式序列化具有此属性的类型(即序列化它们的公共和私有字段)。事实上,asp.net正是这样做的,它全局地改变了[Serializable]
类转换为JSON的方式——正如您所看到的。
为了防止这种情况,您的选项包括以下内容:
-
在asp.net中全局设置
IgnoreSerializableAttribute = true
。为此,请参阅asp.net Web API和[Serializable]类或在Json.net中全局地设置IgnoreSerializableAttribute。 -
用
[JsonObject(MemberSerialization = MemberSerialization.OptOut)]
:标记您的班级[Serializable] [JsonObject(MemberSerialization = MemberSerialization.OptOut)] public class CurrRateInfo { }
-
用
[DataContract]
和[DataMember]
属性注释您的类。这些优先于[Serializable]
。[Serializable] [DataContract] public class CurrRateInfo { [DataMember] public int CurrID { get; set; } [DataMember] public string CurrCode { get; set; } [DataMember] public double CurrRate { get; set; } [DataMember] public DateTime LastUpdate { get; set; } }
如果您不希望模型直接依赖Json.NET,也不希望更改asp.NET的全局行为,请执行此操作。