【发布时间】:2015-12-06 07:17:28
【问题描述】:
这是一个独立的示例程序来演示我的问题:https://gist.github.com/jennings/46c20733df559d02b9ad
我正在编写一个类型 Maybe<T>,它看起来像这样:
public struct Maybe<T> : IXmlSerializable where T : class
{
readonly T _value;
//...
}
我可以完成这两个序列化目标之一吗?
如果
Maybe<T>类型的属性正在被序列化,如果其_value为空,则根本不发出该属性(字符串属性似乎有这种行为)。序列化
_value就位的Maybe<T>。
所以如果使用我的类型的类看起来像这样:
public class AnyRandomObjectUsingMyType
{
public Maybe<string> MaybeAString{ get; set; }
}
那么如果MaybeaString._value 为空,我在序列化时想要这个:
<AnyRandomObjectUsingMyType>
</AnyRandomObjectUsingMyType>
我不想要以下任何一种:
<AnyRandomObjectUsingMyType>
<MaybeAString xsi:nil="true" />
</AnyRandomObjectUsingMyType>
<AnyRandomObjectUsingMyType>
<MaybeAString></MaybeAString>
</AnyRandomObjectUsingMyType>
我不想在AnyRandomObjectUsingMyType上配置序列化,因为会有很多很多。我宁愿让Maybe<T> 控制它,这样到处都能得到相同的行为。
一些上下文
Maybe<T> 类型用于替代T。但是我们在几个地方使用了 XML 序列化。如果有这样的对象:
// Version 1 class
public class SomethingBeingSerialized
{
public string SomeValue { get; set; }
}
当 SomeValue 为 null 时,此类序列化为:
<SomethingBeingSerialized>
</SomethingBeingSerialized>
我希望能够将课程更改为:
// Version 2 class
public class SomethingBeingSerialized
{
public Maybe<string> SomeValue { get; set; }
}
而且我希望序列化的表示是相同的。如果 V1 应用程序反序列化,它会得到一个空字符串。如果 V2 应用反序列化,它会得到一个 Maybe<string>,它代表 None。
我已经尝试在我的 IXmlSerializable.WriteXml 方法中执行此操作,但是当它被调用时,XmlWriter 似乎已经向它的底层流写入了这么多内容:
<SomeValue
所以当我的WriteXml 方法被调用时,似乎为时已晚。也许还有另一种方法来控制它?
如果我可以向序列化程序指定:“一旦遇到Maybe<T> 类型的对象,就序列化它的_value 属性来代替Maybe<T>”,这也将实现我的目标。
【问题讨论】:
标签: c# serialization ixmlserializable