c#中的XML序列化
本文关键字:序列化 XML 中的 | 更新日期: 2023-09-27 17:53:05
我的类看起来很像这样:
[Serializable]
class ExampleClass {
public bool Value { get; set; }
public string Names { get; set; }
}
我想把它序列化成这样:for Value == true:
<ExampleClass>
<Value>
<Names>SomeName</Names>
</ExampleClass>
and for Value == false:
<ExampleClass>
<Value/>
<Names>SomeName</Names>
</ExampleClass>
如您所见,对于Value==true,我们得到一个开始标记,而没有属性。如果Value为false,我们只得到结束标记。
我如何用c#序列化实现这一点?
我可以问一下为什么你想故意误用。net库吗?如前所述,您所要求的是无效的XML,您将在框架中找到的大多数类都是专门为避免不匹配标记等错误而设计的。所以可能的答案是,你不能。
如果你能更详细地描述问题,别人可能会给你找到一个更好的解决方案。
您似乎需要无效的XML。
没有工具或API可以让您这样做,您必须使用textwwriter编写自己的XML。
最好的建议当然是而不是。重新考虑你的解决方案。正如其他人所说,您要求生成的不是有效的XML。
我曾经必须生成一个xml文件,其中在某个地方有一个非打印字符。当然,这不是XML,但您仍然可能被要求这样做。
让我们假设你找不到指定协议的人,并请求愤怒的xml之神用闪电打击他们。
如果您需要生成有点像XML但又不完全像XML的东西,那么通过标准XML序列化器将其运行到字符串变量中,然后执行搜索/替换可能是您的最佳选择。比如:
XmlSerializer serializer = new XmlSerializer(someobj.GetType());
string asString = null;
using (StringWriter writer = new StringWriter())
{
serializer.Serialize(writer, someobj);
asString = writer.ToString();
}
string weirdXml = asString.Replace("<Value>True</Value>","<Value>").Replace("<Value>False</Value>","<Value/>");
(确保每次编译代码时都向xml之神祈祷宽恕)
我有一种感觉,你真正想要的是把一个对象转换成XML,而你并不真正关心ISerializable
接口的实现。
如果是这种情况,请使用TextWriter
并根据您的对象编写文本文件
好吧,正如大家所说的那样,在value = true的情况下你要做的是无效的属性。
相反,因为我假设您希望只有当值为真时才出现在XML中,所以将其作为属性添加。或者说作为可选属性。只有当值为true时才会出现
:当真实的,
<ExampleClass value=true>
<Names>SomeName</Names>
</ExampleClass>
,当
为false时 <ExampleClass >
<Names>SomeName</Names>
</ExampleClass>
你必须在类的属性中添加以下属性:
[System.Xml.Serialization.XmlAttributeAttribute()]
[System.ComponentModel.DefaultValueAttribute(false)]
当元素/属性的值等于默认值时,它将不包含在生成的xml中!
有一种方法可以做到这一点(即使您使用的是这种蹩脚的协议):
[XmlIgnore]
public bool Value { get; set; }
[XmlText]
public string ValueString
{
get
{
return Value ? "<Value>" : "<Value/>";
}
set
{
}
}