.Net 3.0 と VS2005 を使用。
問題のオブジェクトは WCF サービスから消費され、レガシ API の XML にシリアル化されます。したがって、TestObject をシリアル化するのではなく、[XmlRoot] 属性が欠落している .TestObject をシリアル化していました。ただし、子要素のすべての [Xml*] 属性は、生成されたプロキシ コードに含まれていたため、問題なく機能しました。そのため、すべての子要素は正常に機能しましたが、生成されたプロキシ コードに [XmlRoot] 属性が含まれていなかったため、外側の要素は正常に機能しませんでした。[XmlRoot] 属性を含む元のオブジェクトは、手動で正常にシリアル化されます。
生成されたプロキシ クラスも正しくシリアル化されるように、プロキシ コードに [XmlRoot] 属性を含めることはできますか? それができない場合は、[XmlType] を使用する必要があると思いますが、他のコンポーネントを変更する必要があるため、前者を優先します。また、自動生成されたプロキシ クラスを手動で編集する必要も避けたいと考えています。
サンプル コードを次に示します (クライアントとサービスを同じアプリに含めました。これは迅速でテスト目的のためです。サービス参照コードをコメント アウトし、アプリの実行中にサービス参照を追加してから、サービス コードのコメントを外して実行します。 .)
namespace SerializationTest {
class Program {
static void Main( string[] args ) {
Type serviceType = typeof( TestService );
using (ServiceHost host = new ServiceHost(
serviceType,
new Uri[] {
new Uri( "http://localhost:8080/" )
}
))
{
ServiceMetadataBehavior behaviour = new ServiceMetadataBehavior();
behaviour.HttpGetEnabled = true;
host.Description.Behaviors.Add( behaviour );
host.AddServiceEndpoint( serviceType, new BasicHttpBinding(), "TestService" );
host.AddServiceEndpoint( typeof( IMetadataExchange ), new BasicHttpBinding(), "MEX" );
host.Open();
TestServiceClient client = new TestServiceClient();
localhost.TestObject to = client.GetObject();
String XmlizedString = null;
using (MemoryStream memoryStream = new MemoryStream()) {
XmlSerializer xs = new XmlSerializer( typeof( localhost.TestObject ) );
using (XmlWriter xmlWriter = XmlWriter.Create(memoryStream)) {
xs.Serialize( xmlWriter, to );
memoryStream = (MemoryStream)xmlWriter.BaseStream;
XmlizedString = Encoding.UTF8.GetString( memoryStream.ToArray() );
Console.WriteLine( XmlizedString );
}
}
}
Console.ReadKey();
}
}
[Serializable]
[XmlRoot( "SomethingElse" )]
public class TestObject {
private bool _worked;
public TestObject() { Worked = true; }
[XmlAttribute( AttributeName = "AttributeWorked" )]
public bool Worked {
get { return _worked; }
set { _worked = value; }
}
}
[ServiceContract]
public class TestService {
[OperationContract]
[XmlSerializerFormat]
public TestObject GetObject() {
return new TestObject();
}
}
}
これが生成する Xml を次に示します。
<?xml version="1.0" encoding="utf-8"?>
<TestObject xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" AttributeWorked="true" />