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

时间:2015-12-15 11:07:47

标签: c# json serialization asp.net-web-api dotnetnuke

我正在尝试将[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());
    }        
}

提前致谢。

1 个答案:

答案 0 :(得分:0)

假设您使用的是最近版本的,那么Json.NET serializer is being used to serialize your class。默认情况下,Json.NET会忽略[Serializable],但可以强制它使用此属性序列化类型,方法与BinaryFormatter相同(即通过序列化其公共和私有字段)将IgnoreSerializableAttribute上的DefaultContractResolver设置为false。实际上,asp.net就是这样做的,它会全局地改变[Serializable]类转换为JSON的方式 - 正如您所看到的那样。

为防止出现这种情况,您的选项包括:

  1. 在asp.net中全局设置IgnoreSerializableAttribute = true。要执行此操作,请参阅ASP.NET Web API and [Serializable] classSetting IgnoreSerializableAttribute Globally in Json.net

  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的全局行为,请执行此操作。