为了更好地控制序列化,我将一个类从[DataContract]转换为[Serializable],实现了GetObjectData和特殊的反序列化构造函数。当我这样做时,现在发出的XML具有应用于所有元素的类型信息。我不想要这些多余的信息,我想知道如何通知序列化程序不输出它。
以下是使用[DataContract]的示例代码:
[DataContract(Namespace = "")]
class Test
{
public Test() { }
[DataMember]
public Nullable<int> NullableNumber = 7;
[DataMember]
public int Number = 5;
public static void Go()
{
var test = new Test();
var dcs = new DataContractSerializer(typeof(Test));
using (var s = new StreamWriter("test.xml"))
{
dcs.WriteObject(s.BaseStream, test);
}
}
}
这会输出以下XML(请注意Nullable Number和Number上没有类型信息 - 这是所需的输出):
<Test xmlns:i="http://www.w3.org/2001/XMLSchema-instance">
<NullableNumber>7</NullableNumber>
<Number>5</Number>
</Test>
如果我修改上面的代码如下(添加[Serializable],:ISerializable和两个序列化方法):
[Serializable]
class Test : ISerializable
{
public Test() { }
public Nullable<int> NullableNumber = 7;
public int Number = 5;
public static void Go()
{
var test = new Test();
var dcs = new DataContractSerializer(typeof(Test));
using (var s = new StreamWriter("test.xml"))
{
dcs.WriteObject(s.BaseStream, test);
}
}
public Test(SerializationInfo info, StreamingContext context)
{
NullableNumber = info.GetInt32("NullableNumber");
Number = info.GetInt32("Number");
}
public void GetObjectData(SerializationInfo info, StreamingContext context)
{
info.AddValue("NullableNumber", NullableNumber);
info.AddValue("Number", Number);
}
}
它现在发出以下XML。注意添加到每个元素的类型信息(i:type =“x:int”)。
<Test xmlns="http://schemas.datacontract.org/2004/07/XMLSerialization" xmlns:i="http://www.w3.org/2001/XMLSchema-instance" xmlns:x="http://www.w3.org/2001/XMLSchema">
<NullableNumber i:type="x:int" xmlns="">7</NullableNumber>
<Number i:type="x:int" xmlns="">5</Number>
</Test>
为什么这样做?我该如何阻止它呢?
谢谢!
答案 0 :(得分:0)
你需要ISerializable
吗?常见的DataContractSerializer
没有给你什么?如果你切换回这个,它应该可以正常工作。
基本上,通过实现自定义序列化,数据不再基于契约 - 因此 包含此额外信息以保证以后能够理解它。
那么:在这种情况下是否有理由实施ISerializable
?
答案 1 :(得分:0)
如果要完全控制到xml的序列化,可以使用XmlSerializer
pushd ./+
样本序列化代码:
public class Test
{
[XmlIgnore]
public Nullable<int> NullableNumber = 7;
[XmlElement("NullableNumber")]
public int NullableNumberValue
{
get { return NullableNumber.Value; }
set { NullableNumber = value; }
}
public bool ShouldSerializeNullableNumberValue()
{
return NullableNumber.HasValue;
}
[XmlElement]
public int Number = 5;
}
结果:
static void Main(string[] args)
{
XmlSerializer serializer = new XmlSerializer(typeof(Test));
serializer.Serialize(Console.Out, new Test());
}
答案 2 :(得分:0)
从.Net Framework 4.5(和.Net Core 1.0)开始,可以使用DataContractJsonSerializerSettings
类:
DataContractJsonSerializerSettings settings = new DataContractJsonSerializerSettings
{
EmitTypeInformation = EmitTypeInformation.Never
};
var dcs = new DataContractSerializer(typeof(Test), settings);
EmitTypeInformation
设置告诉序列化程序在序列化过程中不要输出(烦人?)__type
参数。
还有一系列其他有用的设置。 Here is the docs page代表DataContractJsonSerializerSettings
。