1

r275 バージョンに更新したところ、DataContract クラスを正しく管理していないようです。この非常に単純なクラスをシリアル化することによって:

[DataContract]
public class ProtoData
{
    [DataMember(Order = 1)]
    private long _id;
    [DataMember(Order = 2)]
    private string _firstName;
    [DataMember(Order = 3)]
    private string _lastName;

    public long Id
    {
        get { return _id; }
        set { _id = value; }
    }

    public string FirstName
    {
        get { return _firstName; }
        set { _firstName = value; }
    }

    public string LastName
    {
        get { return _lastName; }
        set { _lastName = value; }
    }

    public ProtoData(long id, string firstName, string lastName)
    {
        _id = id;
        _firstName = firstName;
        _lastName = lastName;
    }

    public ProtoData()
    {
    }

Only data-contract classes (およびそのようなリスト/配列) を処理できます (エラー処理 ProtoData)

4

2 に答える 2

4

本当に?つまり....奇妙な; 私は、ユニットテストがそのような重大な変化をもたらすことを期待していました。正しいバージョンを使用していますか?2.0バージョン(これはWCF、3.0拡張機能であるため、サポートは含まれていません)と別の3.0バージョンがあります。[DataContract]3.0バージョンが必要です(NET30.zip)。

r275/NET30で正常にテストされました。

static void Main() {
    ProtoData pd = new ProtoData {
        FirstName = "Marc",
        LastName = "Gravell",
        Id = 23354
    }, clone;
    using (MemoryStream ms = new MemoryStream()) {
        Serializer.Serialize(ms, pd);
        Console.WriteLine(ms.Length);
        ms.Position = 0;
        clone = Serializer.Deserialize<ProtoData>(ms);            
    }
    Console.WriteLine(clone.FirstName);
    Console.WriteLine(clone.LastName);
    Console.WriteLine(clone.Id);
}

出力あり:

19
Marc
Gravell
23354
于 2009-11-22T09:44:54.470 に答える
0

次のことを試してください。

  • すべてのプライベートメンバーを削除します
  • 公共施設を使用する

    パブリック文字列LastName;

  • [DataMember]ですべてのパブリックプロパティをマークします

于 2009-11-21T11:25:36.863 に答える