3

Studentクラスをシリアライズ可能にするにはどうすればよいですか? この記事を読んでいますが、以下のシナリオで実装する場合、どのアプローチが正しいかわかりません。

public class Student
{
    private string _studentNumber;
    private string _lastName;
    private string _firtName;
    private List<Subject> _subjects;

    public Student() { }

    public string StudentNumber
    {
        get { return _studentNumber; }
        set { _studentNumber = value; }
    }

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

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

    public List<Subject> Subjects
    {
        get { return _subjects; }
        set { _subjects = value; }
    }
}

public class Subject
{
    private string _subjectCode;
    private string _subjectName;

    public Subject() { }

    public string SubjectCode
    {
        get { return _subjectCode; }
        set { _subjectCode = value; }
    }

    public string SubjectName
    {
        get { return _subjectName; }
        set { _subjectName = value; }
    }
}
4

2 に答える 2

9

の場合は、の前にBinaryFormatter追加するだけです[Serializable]public class ....

のためXmlSerializerに、何もありません。要素が必要だと仮定すると、うまくいくはずです

DataContractSerializer(厳密に言えば 3.0 クラス) の場合、クラスとプロパティに追加し[DataContract]ます[DataMember]

protobuf-net の場合、それぞれが unique を指定しDataContractSerializerている限り属性を使用できます。また、uniqueのクラスおよび各プロパティで使用することもできます。[DataMember]Order=[ProtoContract][ProtoMember(n)]n

JavaScriptSerializer(技術的には3.5)の場合、何もありません-動作するはずです

の場合Json.NET、何もありません-動作するはずです

他のオプションにはISerializableorIXmlSerializableの実装が含まれますが、率直に言って、それは必要ありません。

于 2012-05-08T06:05:54.843 に答える
2

通常、インターフェイスを実装せずにシリアル化して、オブジェクトのディープ コピーを作成しIClonenableます。

あなたの場合、使用できます

[Serializable()]
public class Student
{
   // Your Class
}

拡張メソッドを作る

public static class ExtensionMethod
{  
    public static T DeepClone<T>(this T element)
    { 
        MemoryStream m = new MemoryStream();
        BinaryFormatter b = new BinaryFormatter();
        b.Serialize(m, element);
        m.Position = 0;
        return (T)b.Deserialize(m);
    }
}

そしてそれを次のように呼び出します

yourclassobject.DeepClone();
于 2012-05-08T06:06:20.990 に答える