可序列化对象排除我从客户端调用的公共属性

Posted

技术标签:

【中文标题】可序列化对象排除我从客户端调用的公共属性【英文标题】:serializable object exclude my public property calling from client 【发布时间】:2014-07-11 10:01:52 【问题描述】:

我正在使用 Asp.net web api,我的模型类如下

[Serializable]    
public class Workspace

    private string strID;
    public string strName;

    public string ID
    
        get  return strID; 
        set  strID = value; 
    

    public string Name
    
        get  return strName; 
        set  strName = value; 
    


我在控制器中有以下获取方法

public Workspace GetWorkSpace()
    
        if (objWorkspace == null)
                     
            objWorkspace = new Workspace();
            objWorkspace.ID = Guid.NewGuid().ToString();
            objWorkspace.Name = "Workspace 1";

        

        return objWorkspace;
    

我正在尝试使用 Jquery 获取此对象,如下所示

var uri = 'api/workspace/GetWorkspace';
    $(document).ready(function () 
        $.getJSON(uri)
        .done(function (data) 

            $('#workspaceId').append(data.ID);
            $('#workspaceName').append(data.Name);

        );

    );

我在数据中获取响应对象,但它排除了我的公共属性“ID”和“名称”,如下所示

strID: "a0a523c6-f657-40df-b957-114b87de02f8"
strName: "Workspace 1"
__proto__: Object

如您所见,响应对象得到 "strID, and strName" , 它们是模型类中的私有变量,而应该是响应数据中的ID和名称, 此外,如果我从我的模型类中删除 [Serializable] 属性,我将得到所需的结果。 谁能解释一下,我对 [Serializable] 属性做错了什么

您的帮助将不胜感激

【问题讨论】:

你有 public string strName; 不是私有的。 它是你控制器中的公共方法吗?我想你有一个ActionResult 返回类型的方法(即使不是严格要求)。 “正确的”一个应该是JsonResultreturn Json(objWorkspace, JsonRequestBehavior.AllowGet); 我不再对 .NET 做太多事情了,但是您能尝试使用ISerializable 接口并实现GetObjectData 方法来选择要序列化的内容和方式吗? 哎呀,抱歉,这实际上是私有变量 strName。 【参考方案1】:

我使用自定义ContractResolver,设置:

public MyResolver()

    IgnoreSerializableAttribute = true;

这里记录了DefaultContractResolver.IgnoreSerializableAttribute Property:

如果在序列化和反序列化类型时将忽略 SerializableAttribute 属性,则为 true;否则为假。

如果你不打算实现自定义解析器,你可以这样做:

ASP.NET Web API and [Serializable] class

从该来源引用的 sn-p:

((DefaultContractResolver)config
     .Formatters
     .JsonFormatter
     .SerializerSettings
     .ContractResolver
).IgnoreSerializableAttribute = true;

【讨论】:

【参考方案2】:

或者,您可以通过使用 [JsonObject] 装饰 Workspace 类型来解决此问题。

【讨论】:

以上是关于可序列化对象排除我从客户端调用的公共属性的主要内容,如果未能解决你的问题,请参考以下文章

Protobuf-net:如何从隐式所有公共字段的波尔图合同中排除只读属性(只有吸气剂)?

JSON序列化(stringify)对象时排除某些属性的两种方法

java 序列化时排除指定属性

从春季安全会话序列化中排除属性?

如何不序列化 JSON 对象的 __type 属性

根据GSON中的值从序列化中排除某些字段