将[Serializable]与PetaPoco实体和WebApi问题一起使用



我正在尝试将[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的方式——正如您所看到的。

为了防止这种情况,您的选项包括以下内容:

  1. 在asp.net中全局设置IgnoreSerializableAttribute = true。为此,请参阅asp.net Web API和[Serializable]类或在Json.net中全局地设置IgnoreSerializableAttribute。

  2. [JsonObject(MemberSerialization = MemberSerialization.OptOut)]:标记您的班级

    [Serializable]
    [JsonObject(MemberSerialization = MemberSerialization.OptOut)]
    public class CurrRateInfo
    {
    }
    
  3. [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的全局行为,请执行此操作。

最新更新