可序列化的类

时间:2012-05-08 06:03:06

标签: c# .net-2.0

如何将学生类序列化?我正在读这个article,但如果我在下面的场景中实现它,我不知道什么是正确的方法。

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; }
    }
}

2 个答案:

答案 0 :(得分:9)

对于BinaryFormatter,只需在[Serializable]

之前添加public class ....即可

XmlSerializer,没有;假设你想要元素

那应该可以正常工作

对于DataContractSerializer(严格来说是3.0级),将[DataContract]添加到班级,将[DataMember]添加到属性

对于protobuf-net,只要每个DataContractSerializer指定一个唯一的[DataMember],您就可以使用Order=属性,或者您可以在课程中使用[ProtoContract],每个媒体资源上的[ProtoMember(n)]代表唯一n

对于JavaScriptSerializer(技术上为3.5),没有 - 它应该有用

对于Json.NET,没有 - 它应该有效

其他选项包括实施ISerializableIXmlSerializable,但坦率地说:您不需要这样做。

答案 1 :(得分: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();