是否可以使用DataContractJsonSerializer序列化不同的属性集?

时间:2012-08-17 13:20:24

标签: json wcf rest

我正在使用WCF和JSON构建(希望)RESTful服务。

例如:

[DataContract]
public class Person
{
    // This member is serialized.
    [DataMember]
    internal string FullName;

    // This is serialized even though it is private.
    [DataMember]
    private int Age;

    // This is not serialized because the DataMemberAttribute 
    // has not been applied.
    private string MailingAddress;

    // This is not serialized, but the property is.
    private string telephoneNumberValue;

    [DataMember]
    public string TelephoneNumber
    {
        get { return telephoneNumberValue; }
        set { telephoneNumberValue = value; }
    }
}

我需要从WCF方法返回一个没有电话号码的Person对象(即w / FullName和Age),所以我想知道是否可以使用Person类和WFC方法的属性属性来实现它? / p>

由于

2 个答案:

答案 0 :(得分:2)

或者,您可以使用[DataMember(EmitDefaultValue = false)]并将您不想序列化的字段设置为null或根本不进行初始化

E.g。

[DataContract]
public class Person
{
    // This member is serialized.
    [DataMember]
    internal string FullName;

    [DataMember( EmitDefaultValue=false)]
    public string TelephoneNumber
    {
        get { return telephoneNumberValue; }
        set { telephoneNumberValue = value; }
    }
}

然后你可能有两种方法以两种不同的方式加载\ create Person

public Person LoadWithPhone() 
    {
        return new Person() { FullName = "Name", TelephoneNumber = "123456" };
    }

 public Person LoadWithoutPhone() 
    {
        return new Person() { FullName = "Name" }; //TelephoneNumber is null
    }

然后当序列化由第二种方法创建的人时,TelephoneNumber将不会被序列化 当从DB加载对象时,这可能很有用,您可以使用多个方法加载不同的列,或者使用一个正在构建查询的方法和仅使用请求的字段初始化对象。

答案 1 :(得分:1)

简单的答案是你不能这样做,但这里有一个例子,你可以在没有大量工作的情况下完成同样的目标。

您需要有两个Person个类,一个具有PhoneNumber属性DataMember,另一个不具有Person属性。执行此操作的最佳方法可能是从主[DataContract] public class PersonWithoutPhone { private Person _p; public PersonWithoutPhone(Person p) { _p = p; } [DataMember] internal string FullName { get { return _p.FullName; } } [DataMember] private int Age { get { return _p.Age; } } public string TelephoneNumber { get { return _p.TelephonNumber; } } } [DataContract] public class PersonWithPhone { private Person _p; public PersonWithoutPhone(Person p) { _p = p; } [DataMember] internal string FullName { get { return _p.FullName; } } [DataMember] private int Age { get { return _p.Age; } } [DataMember] public string TelephoneNumber { get { return _p.TelephonNumber; } } }

创建两个子类
{{1}}