1

是否可以从客户端应用程序中隐藏类的数据成员但仍使用 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>

谢谢,

约翰

4

2 回答 2

3

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

于 2012-10-09T22:04:29.777 回答
1

我原以为您根本不需要序列化 ​​AddressLine1 属性,只需将其作为辅助只读属性即可。

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

由于可以在需要时构造值,因此除了街道属性集之外,序列化和传输它没有任何意义。当然,您可以通过缓存该值并仅在街道属性之一实际更改时重新创建它来提高实现效率。

于 2012-10-09T21:55:10.433 回答