3

私は IntEx 構造を持っています - つまり、通常の Int32 と処理された操作を拡張します。次のようになります。

[Serializable]
public struct IntEx
{
    private int internalValue;

    private IntEx(int value)
    {
        internalValue = value;
    }

    public static implicit operator int(IntEx value)
    {
        return value.internalValue;
    }

    public static implicit operator IntEx(int value)
    {
        return new IntEx(value);
    }
}

この構造体を WCF 経由で送信すると、JSON を使用してシリアル化され、出力が「きれいに見える」ようになります。以下のサンプルコードを使用します。

DataContractJsonSerializer jsonSerializer = new DataContractJsonSerializer(typeof(TestClass));

using (MemoryStream stream = new MemoryStream())
{
    jsonSerializer.WriteObject(stream, testClass);

    string serializedString = Encoding.UTF8.GetString(stream.GetBuffer());

    Console.WriteLine("JSON: {0}", serializedString);
}
public class TestClass
{
    public int I1 { get; set; }

    public IntEx I2 { get; set; }
}

出力は次のようになります

JSON: {"I1":11,"I2":{"internalValue":22}}

クライアントおよびその他の「サードパーティ」プログラムは、この形式を使用します ( internalValue を使用)

IntEx の使用は、私のアプリケーションで広く使用されています。オブジェクトの 1 つは XML にシリアル化されます (何らかの設定)。このオブジェクトは型として IntEx を使用します。このプロパティがないと、空のノードのようにシリアル化されるため、IntEx を構造化するために IXmlSerializable を実装する必要があります。

XML: <TestClass><I1>11</I1><I2 /></TestClass>

IXmlSerializable を使用するように IntEx を変更した場合

[Serializable]
public struct IntEx : IXmlSerializable
{
    private int internalValue;

    private IntEx(int value)
    {
        internalValue = value;
    }

    public static implicit operator int(IntEx value)
    {
        return value.internalValue;
    }

    public static implicit operator IntEx(int value)
    {
        return new IntEx(value);
    }

    System.Xml.Schema.XmlSchema IXmlSerializable.GetSchema()
    {
        return null;
    }

    void IXmlSerializable.ReadXml(System.Xml.XmlReader reader)
    {
        throw new NotImplementedException();
    }

    void IXmlSerializable.WriteXml(System.Xml.XmlWriter writer)
    {
        writer.WriteValue(internalValue);
    }
}

XML出力は問題ないようです

XML: <TestClass><I1>11</I1><I2>22</I2></TestClass>

しかし、JSON は次のようになっているため、すべてのサービスが故障しています。

JSON: {"I1":11,"I2":"<IntEx xmlns=\"http:\/\/schemas.datacontract.org\/2004\/07\/TestJSONSerialization\">22<\/IntEx>"}

IXmlSerializable を使用する場合、JSON シリアライゼーションは私がシリアライズを担当していると「考える」ので、このオブジェクトは私に任せてください...しかし、どうすれば「元の」シリアライゼーションに戻すことができますか。

だから今、私は行き詰まっています...以前のようにJSON出力が必要ですが、2つの条件でXMLに設定を書き込む方法も必要です:

  1. internalValue は非公開のままにする必要があります - 一部の公開プロパティを使用してアクセスできないようにする必要があります
  2. 大量のコードを書き直して、変更 (JSON のプロパティにボックス化を使用) したり、XML ファイルに保存できるすべての可能なプロパティやクラスを変更したりしたくありません。

この問題を解決するにはどうすればよいですか?:/

4

1 に答える 1