gpt4 book ai didi

c# - 将 ISerializable 与 DataContractSerializer 一起使用时,如何阻止序列化程序输出类型信息?

转载 作者:可可西里 更新时间:2023-11-01 08:50:04 25 4
gpt4 key购买 nike

为了更好地控制序列化,我将一个类从 [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(注意可空数字和数字上没有类型信息——这是所需的输出):

<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>

为什么要这样做?我如何阻止它这样做?

谢谢!

最佳答案

这里需要ISerializable吗?常规 DataContractSerializer 没有给您什么?如果你切换回这个,它应该可以正常工作。

基本上,通过实现自定义序列化,数据不再基于契约 - 因此它必须包含这些额外信息以保证它以后能够理解它。

那么:在这种情况下是否有理由实现ISerializable

关于c# - 将 ISerializable 与 DataContractSerializer 一起使用时,如何阻止序列化程序输出类型信息?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/710745/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com