1

私はこのコードを持っています:

IList<Type> lista = new List<Type>();
lista.Add(typeof(Google.GData.YouTube.YouTubeEntry));

using (FileStream writer = new FileStream("c:/temp/file.xml", FileMode.Create, FileAccess.Write))
{
    DataContractSerializer ser = new DataContractSerializer(videoContainer.GetType(), lista);
    ser.WriteObject(writer, videoContainer);
}

これは私にこの例外を生成します:Type 'Google.GData.Client.AtomUri' cannot be serialized. Consider marking it with the DataContractAttribute attribute, and marking all of its members you want serialized with the DataMemberAttribute attribute. See the Microsoft .NET Framework documentation for other supported types.

Google.GData.Client.AtomUriこれらの属性を追加して編集することはできません(これはライブラリです)。

では、どうすればこの問題を解決できますか?

4

2 に答える 2

2

これらの属性を追加してGoogle.GData.Client.AtomUriを編集できません(これはライブラリです)。

次に、2つの選択肢があります。

  • シリアル化可能な別のDTOレイヤーを作成します。これは通常は些細なことであり、シリアライザーで問題が発生した場合は、ほとんどの場合、私の優先ルートです。意味:選択したシリアライザーに適した方法で装飾および構築された、クラスとほぼ同じように見える独自の型のセットをGData記述し、それらの間をマップするための数行のコードを記述します。
  • DataContractSerializerコンストラクターへの複数のオーバーロードの1つを使用して、追加情報を指定します。率直に言って、これは通常、うまくいくまで、厄介なコードでますますそれを伝えるという厄介な迷路にあなたを連れて行きます; DTOははるかに保守可能です
于 2013-03-11T13:37:24.080 に答える
1

プロパティの値だけを求めている場合は、基本的なリフレクションを使用してそれらを表示できます。これにより、特定のオブジェクトのコレクションの反復処理を含む、すべてのプロパティ値が表示されます。世界で最高のコードではありませんが、オブジェクトを読み取るための素早い汚いソリューションです。

static void ShowProperties(object o, int indent = 0)
{
    foreach (var prop in o.GetType().GetProperties(BindingFlags.Public | BindingFlags.Instance))
    {
        if (typeof(IEnumerable).IsAssignableFrom(prop.PropertyType) && prop.PropertyType != typeof(string))
        {
            Console.WriteLine("{0}{1}:", string.Empty.PadRight(indent), prop.Name);
            var coll = (IEnumerable)prop.GetValue(o, null);
            if (coll != null)
            {
                foreach (object sub in coll)
                {
                    ShowProperties(sub, indent + 1);
                }
            }
        }
        else
        {
            Console.WriteLine("{0}{1}: {2}", string.Empty.PadRight(indent), prop.Name, prop.GetValue(o, null));
        }
    }
    Console.WriteLine("{0}------------", string.Empty.PadRight(indent));
}
于 2013-03-11T14:28:39.747 に答える