2

私は現在、奇妙な問題を解決しようとしています。多くの情報を見つけることができないもの。

要するに:

シリアル化された xml オブジェクトを逆シリアル化すると、正しいオブジェクト タイプのインスタンスが取得されますが、オブジェクト内のデフォルト値しか取得されません。

より長い話:

シリアライゼーションとデシリアライゼーションは、2 つの異なるプラットフォームで発生します。1 つは .net コンパクト フレームワーク (Windows 携帯電話用) で、もう 1 つは通常の .net フレームワークです。

同じプラットフォームでシリアル化してから逆シリアル化すると、オブジェクトが正しく埋められます。この問題は、シリアル化された文字列が他のプラットフォームに送信された場合にのみ発生します。

サービスにデータをプロビジョニングする別のサービスからテスト xml ファイルも取得しました。これらの xml ファイルは正しく逆シリアル化されます。

詳細:

生成される XML は、プラットフォームによって若干異なります。(注: これらは内部 xml 構造からのフラグメントであり、繰り返し発生する相違点を特定しました。読み取り: ユニットはルート ノードではありません)

クライアント (電話、コンパクト フレームワーク)

<Unit>
    <UnitId xmlns="">555</UnitId>
    <VehicleId xmlns="">555</VehicleId>
    <EmployeeId xmlns="">004</EmployeeId>
</Unit>

サーバー (通常の .net サーバー)

<Unit xmlns="">
    <UnitId>555</UnitId>
    <VehicleId>555</VehicleId>
    <EmployeeId>004</EmployeeId>
</Unit>

親システムから (不明なプラットフォーム)

<Unit>
   <UnitId>308</UnitId>
   <VehicleId>307</VehicleId>
   <EmployeeId>ASA 500</EmployeeId>
</Unit>

また、標準の名前空間 (xmlns) を設定する代わりに、親システムは次のようにルート ノードでプレフィックスを使用します。

<amg:RequestFinishRoute xmlns:amg="http://beans.order.integration.tt.transware.se/order/trackingFinishRoute">

シリアライズして作成したデータは次のようになります。

<RequestFinishRoute xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns="http://beans.order.integration.tt.transware.se/order/trackingFinishRoute">

私は使用します:

System.Xml.Serialization.XmlSerializer

シリアライゼーション/デシリアライゼーションを行うシリアライザー (コンパクト フレームワークでサポートされているシリアライザーのみ)。

これを行うコードは xsd2code によって生成されます。

質問:

この問題に関するヒントやリソースはありますか?

4

3 に答える 3

1

私は一度これに遭遇しました。

私にとって、問題は各プロジェクトにクラスを追加することでした。

名前空間ProjectPC

クラスSerializableClass1

名前空間ProjectMobile

クラスSerializableClass1

クラスが両方の名前空間で同一であったにもかかわらず、からProjectPCへの逆シリアル化に失敗しました。ProjectMobileSerializableClass1

私にとっての解決策は、単一の名前空間を作成し、それを各プロジェクトに個別にインポートすることでした。

名前空間ProjectUniversal

クラスSerializableClass1

これが完了したら、これProjectUniversalを他の各プロジェクトに含める必要があります。

柔軟性を高めるためにProjectUniversal、独自の静的SerializeメソッドとDeserializeメソッドも使用しました。

これが理にかなっていることを願っています。

于 2012-05-09T13:48:08.657 に答える
1

両方のプラットフォームが同じエンコーディングを使用していますか? ハンドヘルド バーコード スキャナーから生成された Xml は、PC 上の VFP プログラムで読み取ることができました。とにかく、私は XmlSerializer の代わりに XmlTextWriter を使用することを好みます。

于 2012-05-08T15:48:59.617 に答える
1

私は解決策を見つけました。同じ問題を抱えている他の人のためにここに投稿しています。

生成されたクラスをいくつか試した結果、コンパクトなフレームワークは派生オブジェクトを好まないことがわかりました。

スキーマは、基本の「ルート」オブジェクトと、いくつかの特殊な「ルート」オブジェクトを定義しました。これは、基本クラス「baseRoute」と「someRoute : baseRoute」などの特殊なルートを生成する xsd2code に変換されます。

継承を削除し、コードを「baseRoute」から特殊なルートにコピーアンドペーストすると、すべての問題が解決しました。

また、VinceL の (ポイント) のアドバイスに従い、XmlTextWriter に変更しました。こうすることで文字コード化が自動で行われるので便利です。

于 2012-05-09T14:02:29.350 に答える