我正在尝试将[Serializable]属性与PetaPoco实体一起使用,以便将其存储在REDIS缓存中。
将[Serializable]属性添加到PetaPoca Entity类允许使用REDIS缓存提供程序缓存它,但随后更改WebAPI将实体序列化为JSON的方式。
有没有办法指定WebAPI如何将对象序列化为JSON?
以下示例,对于具体细节,这是在DNN的DAL2内,并使用DNN的https://github.com/davidjrh/dnn.rediscachingprovider 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());
}
}
提前致谢。
答案 0 :(得分:0)
假设您使用的是最近版本的asp.net-web-api,那么Json.NET serializer is being used to serialize your class。默认情况下,Json.NET会忽略[Serializable]
,但可以强制它使用此属性序列化类型,方法与BinaryFormatter
相同(即通过序列化其公共和私有字段)将IgnoreSerializableAttribute
上的DefaultContractResolver
设置为false
。实际上,asp.net就是这样做的,它会全局地改变[Serializable]
类转换为JSON的方式 - 正如您所看到的那样。
为防止出现这种情况,您的选项包括:
在asp.net中全局设置IgnoreSerializableAttribute = true
。要执行此操作,请参阅ASP.NET Web API and [Serializable] class或Setting IgnoreSerializableAttribute Globally in Json.net。
使用[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的全局行为,请执行此操作。