5

アプリケーションでは、次のインターフェイス/実装構造があります。

public interface IMyInterface
{
  IMyOtherInterface InstanceOfMyOtherInterface { get; }
}

public interface IMyOtherInterface
{
  string SomeValue { get; }
}

[DataContract(Name = "MyInterfaceImplementation", Namespace = "")]
public class MyInterfaceImplementation : IMyInterface
{
  [DataMember(EmitDefaultValue = false), XmlAttribute(Namespace = "")]
  public IMyOtherInterface InstanceOfMyOtherInterface { get; private set; }

  public MyInterfaceImplementation()
  {
    this.InstanceOfMyOtherInterface = new MyOtherInterfaceImplementation("Hello World");
  }
}

[DataContract(Name = "MyOtherInterfaceImplementation", Namespace = "")]
public class MyOtherInterfaceImplementation : IMyOtherInterface
{
  [DataMember]
  public string SomeValue { get; private set; }

  public MyOtherInterfaceImplementation(string value)
  {
    this.SomeValue = value; 
  }
}

これで、.Net DataContractSerializerを使用してこれを(私の場合は文字列に)シリアル化するたびに、次のようになります。

var dataContractSerializer = new DataContractSerializer(typeof(MyInterfaceImplementation));
var stringBuilder = new StringBuilder();
using (var xmlWriter = XmlWriter.Create(stringBuilder, new XmlWriterSettings { Indent = true, Encoding = Encoding.UTF8 }))
{
  dataContractSerializer.WriteObject(xmlWriter, this);
}
var stringValue = stringBuilder.ToString();

結果のxmlは次のようになります。

<?xml version="1.0" encoding="utf-16"?>
<z:anyType xmlns:i="http://www.w3.org/2001/XMLSchema-instance" xmlns="" i:type="MyInterfaceImplementation" xmlns:z="http://schemas.microsoft.com/2003/10/Serialization/">
  <InstanceOfMyOtherInterface xmlns="" i:type="InstanceOfMyOtherInterface">
    <SomeValue>Hello World</SomeValue>
  </InstanceOfMyOtherInterface>
</z:anyType>

これらの*anyType*は、他のインターフェイスプロパティと同様に、DatacontractserializerがMyInterfaceImplementationインスタンスをSystem.Objectとしてシリアル化することに由来しているようです。

インターフェイスとその実装で具体的な型を次のように使用した場合:

public interface IMyInterface
{
  MyOtherInterface InstanceOfMyOtherInterface { get; }
}

..それはのように「うまく」動作します-datacontractserializerは作成します

<MyInterfaceImplementation>...</MyInterfaceImplementation>

... z:anyTypeノードの代わりにノードがありますが、インターフェイスのプロパティを変更したくない/変更できません。そのような場合にデータコントラクトシリアライザーを制御または支援する方法はありますか?

4

0 に答える 0