これは、データが強く入力されていない場合に、Webサービス呼び出しを介してデータをシリアル化する方法に関する非常に複雑な質問です。可能な限りレイアウトするようにします。
サンプルストレージオブジェクト:
[Serializable]
public class StorageObject {
public string Name { get; set; }
public string Birthday { get; set; }
public List<NameValuePairs> OtherInfo { get; set; }
}
[Serializable]
public class NameValuePairs {
public string Name { get; set; }
public string Value { get; set; }
}
使用例:
[WebMethod]
public List<StorageObject> GetStorageObjects() {
List<StorageObject> o = new List<StorageObject>() {
new StorageObject() {
Name = "Matthew",
Birthday = "Jan 1st, 2008",
OtherInfo = new List<NameValuePairs>() {
new NameValuePairs() { Name = "Hobbies", Value = "Programming" },
new NameValuePairs() { Name = "Website", Value = "Stackoverflow.com" }
}
},
new StorageObject() {
Name = "Joe",
Birthday = "Jan 10th, 2008",
OtherInfo = new List<NameValuePairs>() {
new NameValuePairs() { Name = "Hobbies", Value = "Programming" },
new NameValuePairs() { Name = "Website", Value = "Stackoverflow.com" }
}
}
};
return o;
}
Webサービスからの戻り値:
<StorageObject>
<Name>Matthew</Name>
<Birthday>Jan 1st, 2008</Birthday>
<OtherInfo>
<NameValuePairs>
<Name>Hobbies</Name>
<Value>Programming</Value>
</NameValuePairs>
<NameValuePairs>
<Name>Website</Name>
<Value>Stackoverflow.com</Value>
</NameValuePairs>
</OtherInfo>
</StorageObject>
私が欲しいもの:
<OtherInfo>
<Hobbies>Programming</Hobbies>
<Website>Stackoverflow.com</Website>
</OtherInfo>
理由とその他のもの:
まず、投稿の長さについては申し訳ありませんが、再現可能なコードも提供したいと思いました。
PHPからWebサービスを利用しているので、この形式で使用したいと思います。簡単に行きたい:
//これは重要です
In PHP => "$Result["StorageObject"]["OtherInfo"]["Hobbies"]".
それが他の形式である場合、それを達成する方法はまったくありません。さらに、C#でサービスを利用している場合は、次のこともできるようにしたいと思います。
//これは重要です
In C# => var m = ServiceResult[0].OtherInfo["Hobbies"];
残念ながら、これを実現する方法がわかりません。IXmlSerializerを実装したカスタムディクショナリを構築することで( StackOverflow:IXmlSerializerディクショナリを参照)、この方法で取得できましたが、WSDLスキーマが水から吹き飛ばされました。また、非常に複雑で、WinFormsTesterアプリケーションでひどい結果をもたらしました。
これを達成する方法はありますか?どのタイプのオブジェクトを作成する必要がありますか?/強く型付けされたコレクションを作成する以外に/これを行う方法はありますか?明らかに、私がそれをこのように強くタイプした場合:
public class OtherInfo {
public string Hobbies { get; set; }
public string FavoriteWebsite { get; set; }
}
そうすれば、完全に機能し、WSDLの問題は発生せず、PHPおよびC#(.OtherInfo.Hobbies)から簡単にアクセスできるようになります。
ただし、リストが何であるかを事前に知る必要があり、データベースから変更できないという点で、NVPのポイントを完全に失うことになります。
みんな、ありがとう!!これに対する何らかの解決策を考え出すことができるといいのですが。再度要件は次のとおりです。
- WSDLスキーマは壊れてはいけません
- 名前と値のペア(NVP)は、属性形式にシリアル化する必要があります
- PHPのNVPに名前で簡単にアクセスできる必要があります["趣味"]
- C#で簡単にアクセスできる(そしてプロキシジェネレーターと互換性がある)必要があります
- 簡単にシリアル化可能
- データを強く入力する必要はありません
今、私はこれを行うためのより良い/異なる方法について/完全に/入力することを開いています。比較的「静的な」情報(Nameなど)と大量のデータを保存しています。もっと良い方法があれば、聞いてみたいです。