是否可以从客户端应用程序隐藏类的数据成员,但仍然可以使用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>
谢谢,
约翰
答案 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;
}
}
由于可以在需要时构造值,除了街道属性集之外,没有必要序列化和传输它。当然,您可以通过缓存值来提高实现效率,并且只有在其中一个街道属性发生变化时才重新创建它。