13

シリアル化をより詳細に制御するために、クラスを から[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>

なぜこれを行うのですか?それをやめさせるにはどうすればよいですか?

ありがとう!

4

3 に答える 3

0

ここは必要ISerializableですか?レギュラーがDataContractSerializerあなたに与えなかったものは何ですか?これに戻せば、問題なく動作するはずです。

基本的に、カスタムのシリアライゼーションを実装することで、データはコントラクトベースではなくなります。そのため、後で理解できることを保証するために、この追加情報を含める必要があります

ISerializableだから:この場合に実装する理由はありますか?

于 2009-04-02T23:00:19.813 に答える