从客户端隐藏datamember但仍然序列化?

时间:2012-10-09 21:33:02

标签: wcf

是否可以从客户端应用程序隐藏类的数据成员,但仍然可以使用XmlSerializer进行序列化?

上下文是我正在获取一个地址,但是在将对象序列化为XML并将其传递给其他东西之前,需要将其中的许多部分连接成一个字符串。

地址类又是一个更大的类的一部分,所以简单地继承和添加这个位更复杂,如果没有嵌套,我的需要不足以保证编写自定义序列化器。

样品:

[DataContract]
public class Address
{
    [DataMember()]
    public string City

    [DataMember()]
    public string State

    [DataMember()]
    public string StreetDirection

    [DataMember()]
    public string StreetName

    [DataMember()]
    public string StreetNumber

    [DataMember()]
    public string StreetSuffix

    [DataMember()]
    public string Unit

    [DataMember()]
    public string Zip

    [IgnoreDataMember()]
    [Serializable]
    public string AddressLine1
}

基本上,我想要一个占位符(AddressLine1),我可以在传递之前放置StreetXXX属性的串联(如果接收者看到各个部分,它就已经存在)。

修改 - 添加示例 输入将类似于:

<Address>
  <StreetNumber>123</StreetNumber>
  <StreetDirection>S.</StreetDirection>
  <StreetName>Main</StreetName>
  <StreetSuffix>St.</StreetSuffix>
  <Unit>207</Unit>
  <City>Denver</City>
  <State>CO</State>
  <Zip>80123</Zip>
</Address>

但是我想结束序列化:

<Address>
  <StreetNumber>123</StreetNumber>
  <StreetDirection>S.</StreetDirection>
  <StreetName>Main</StreetName>
  <StreetSuffix>St.</StreetSuffix>
  <Unit>207</Unit>
  <City>Denver</City>
  <State>CO</State>
  <Zip>80123</Zip>
  <AddressLine1>123 S. Main St.</AddressLine1>
</Address>

谢谢,

约翰

2 个答案:

答案 0 :(得分:3)

您的问题有点令人困惑,因为您提到了XmlSerializer但是您显示了一个DataContract类。是否使用相同的序列化器对数据进行反序列化(读取)和序列化(写入)?如果是这样,它是DataContractSerializer还是XmlSerializer?或者您是否尝试使用DataContractSerializer读取并使用XmlSerializer进行编写?无论如何,假设您使用DataContractSerializer进行读取和写入的简单情况,您需要做的就是将AddressLine1设置为具有getter和setter的属性,并使用[DataMember(IsRequired = false)]标记它。然后,在AddressLine1属性getter中,输入你的地址连接代码,并在属性setter中什么都不做。这样,在反序列化时,AddressLine1将被忽略(即使它在XML中根本不存在它也不会导致错误),但在序列化时它将被正确写出。

答案 1 :(得分:1)

我原以为你根本不需要序列化AddressLine1属性,只需将它作为帮助器只读属性。

[IgnoreDataMember()]
public string AddressLine1
{
    get
    {
        return StreetNumber + " " + StreetDirection + " " + StreetName + " " + StreetSuffice;
    }
}

由于可以在需要时构造值,除了街道属性集之外,没有必要序列化和传输它。当然,您可以通过缓存值来提高实现效率,并且只有在其中一个街道属性发生变化时才重新创建它。