6

私のアプリケーションのアーキテクチャは、このようなものです

MainUI------->WCF------->BLL------->DAL

Entity Framework 4.0 と .Net Framework 4.0 を使用しています。

私のデータ アクセス レイヤーは、オブジェクトの転送中にシリアル化および逆シリアル化される PoCo オブジェクトを返します。

シリアル化される前に WCF がオブジェクトを返すときは問題ありませんが、逆シリアル化されると、カスタム オブジェクトの一部のプロパティ (ナビゲーション プロパティ) が失われることがあります。特に、ネットワーク上でカスタム オブジェクトのリストを送信する場合。常に単一のオブジェクトの値を返します。

記録のために、私は DataContract Serializer を使用しています。

このシリアライゼーション/デシリアライゼーション プロセスについての洞察が必要です。また、シリアル化されたオブジェクトと、オブジェクトがシリアル化および逆シリアル化されている正確なポイントも表示したいと考えています。

4

2 に答える 2

1

シリアライゼーションをデバッグする簡単な方法があるとは思いませんが、実際には魔法はありません。シリアライゼーションは非常に単純なプロセスであり、自分で行うことができます。

記録のために、私は DataContract Serializer を使用しています。

シリアル化/逆シリアル化するコードは次のとおりです

 public static string Serialize(object obj) {
        using(MemoryStream memoryStream = new MemoryStream())
        using(StreamReader reader = new StreamReader(memoryStream)) {
            DataContractSerializer serializer = new DataContractSerializer(obj.GetType());
            serializer.WriteObject(memoryStream, obj);
            memoryStream.Position = 0;
            return reader.ReadToEnd();
        }
    }

    public static object Deserialize(string xml, Type toType) {
        using(Stream stream = new MemoryStream()) {
            byte[] data = System.Text.Encoding.UTF8.GetBytes(xml);
            stream.Write(data, 0, data.Length);
            stream.Position = 0;
            DataContractSerializer deserializer = new DataContractSerializer(toType);
            return deserializer.ReadObject(stream);
        }
    }

一部のプロパティが欠落している場合があります

基本的に、シリアライゼーション プロセス中に何か問題が発生した場合、シリアライザーは SerializationException を (詳細と共に) スローします。あなたの場合(プロパティがまだ空であるか、デフォルトと等しい)、いくつかの属性を忘れているように聞こえます。

まあ、コードなしでもう少し手助けするのは簡単ではありませんが、datacontractserializer の機能に注意してください (こちらを参照)。

特に、ネットワーク上でカスタム オブジェクトのリストを送信する場合。常に単一のオブジェクトの値を返します。

それを再現して、そのための単体テストを作成してみてください。ランダムなエラーはありませんが、エラーにつながる非常に特殊なシナリオのみです。

于 2013-05-07T07:37:03.083 に答える