Asp.net mvc ASP.NET Web API未序列化只读属性

Asp.net mvc ASP.NET Web API未序列化只读属性,asp.net-mvc,asp.net-web-api,Asp.net Mvc,Asp.net Web Api,我将一个API方法从标准MVC操作迁移到新的asp.net Web API测试版,突然一个只读属性不再序列化(都返回JSON)。这是预期的行为吗 编辑:添加了代码示例 我通过nuget包引用了Newtonsoft.Json 4.0.8和System.Json 4.0 public IQueryable<Car> Gets() { return _carRepository.GetCars(); }

我将一个API方法从标准MVC操作迁移到新的asp.net Web API测试版,突然一个只读属性不再序列化(都返回JSON)。这是预期的行为吗

编辑:添加了代码示例

我通过nuget包引用了Newtonsoft.Json 4.0.8和System.Json 4.0

        public IQueryable<Car> Gets()
        {
             return _carRepository.GetCars();
        }

        public class Car
        {
            public IEnumerable<Photo> Photos
            {
                get { return _photos; }
            }

            public string PreviewImageUrl // No longer serialized
            {
                get
                {
                     var mainImage = Photos.FirstOrDefault(o => o.IsMainPreview) Photos.FirstOrDefault();
                        return mainImage != null ? mainImage.Url : (string.Empty);
                    }
                }
             }
         }
publicIQueryable获取()
{
return_carRepository.GetCars();
}
公车
{
公共数字照片
{
获取{return\u photos;}
}
公共字符串PreviewImageUrl//不再序列化
{
得到
{
var mainImage=Photos.FirstOrDefault(o=>o.IsMainPreview)Photos.FirstOrDefault();
返回mainImage!=null?mainImage.Url:(string.Empty);
}
}
}
}

我不知道这是否是预期的行为。我想说的是,输入参数(因为您无法设置它们的值)需要这样做,而输出参数则不需要这样做。所以我想说这是一个输出参数的错误。下面是一个例子来说明这个问题:

型号:

public class Product
{
    public Product()
    {
        Prop1 = "prop1 value";
        Prop2 = "prop2 value";
        Prop3 = "prop3 value";
    }

    public string Prop1 { get; set; }

    [ReadOnly(true)]
    public string Prop2 { get; set; }

    public string Prop3 { get; protected set; }
}
控制器:

public class ProductsController : ApiController
{
    public Product Get(int id)
    {
        return new Product();
    }
}
请求:

api/products/5
结果:

{"Prop1":"prop1 value","Prop2":"prop2 value"}
因此,如果属性没有公共setter,它就不会序列化,这似乎不正常,因为在这种情况下,
产品
类被用作输出


我建议打开一个连接票证,这样Microsoft可以在发布之前修复这个问题,或者至少告诉我们这是设计的。

测试版附带的
JsonMediaTypeFormatter
使用了一个不支持只读属性的序列化程序(因为它们不能正确往返)。我们计划在下一个现实中解决这个问题

同时,您可以使用自定义JSON
MediaTypeFormatter
实现,该实现使用JSON.NET(有一个可用的)而不是内置的格式化程序


更新:还可以查看Henrik关于连接JSON.NET格式化程序的博客:

不需要。您可以发布一些代码来重新处理这个问题吗?您使用的是哪个JSON序列化程序?刚刚升级到RC版本,这似乎仍然是一个问题。只是好奇在最终版本发布之前,事情是否会发生变化,还是我们不应该期望只读属性被序列化?谢谢您可以尝试最新的夜间构建(说明:)。另外,请确保您确实从系统中卸载了测试版。如果它仍然是一个问题,你可以在这里发布一个复制:。谢谢。我已经卸载了测试版并安装了RC,但是忽略了用nuget更新我的项目包,所以我仍然使用测试版。更新后,只读属性将使用JSON序列化,而不是XML。就我而言,JSON是我所需要的一切,所以我很好,但它似乎应该与XML序列化表现相同?