シリアル化をより詳細に制御するために、クラスを から[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、および 2 つのシリアル化メソッドを追加):
[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>
なぜこれを行うのですか?それをやめさせるにはどうすればよいですか?
ありがとう!