アプリケーションでは、次のインターフェイス/実装構造があります。
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ノードの代わりにノードがありますが、インターフェイスのプロパティを変更したくない/変更できません。そのような場合にデータコントラクトシリアライザーを制御または支援する方法はありますか?