2012-05-08 3 views
3

Как я могу сделать Студент класс serializable? Я читаю это 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; } 
    } 
} 
+3

сериализуемой ** по какому сериализатору **? –

+0

Кроме того, если вы используете компилятор C# 3, но с таргетингом на .NET 2.0, вы можете использовать автоматически реализованные свойства, сохраняя некоторую типизацию - **, но ** обратите внимание: это измененное изменение для 'BinaryFormatter' (старые данные не будут быть совместимым, если вы переходите на автоматически реализованные свойства) –

+0

извините, не совсем знакомы с этим, но я ссылаюсь на эту статью. Похоже на мой вопрос: http://stackoverflow.com/questions/364253/how-to-deserialize-xml-document – yonan2236

ответ

9

Для BinaryFormatter, просто добавьте [Serializable] перед public class ....

Для XmlSerializer, ничего; что должно работать если вы хотите элементы

Для DataContractSerializer (3,0 класса, строго говоря), добавьте [DataContract] к классу, и [DataMember] свойствам

Для Protobuf-сети, вы можете использовать DataContractSerializer атрибуты, поскольку каждый [DataMember] определяет уникальный номер Order=, или вы можете использовать [ProtoContract] по классу, и [ProtoMember(n)] на каждую собственность, для уникального n.

Для JavaScriptSerializer (технически 3.5), ничего - он должен работать

Для Json.NET, ничего - он должен работать

Другие варианты будут включать осуществление ISerializable или IXmlSerializable, но, если честно: вам не нужно, что ,

+0

информация перегрузка:) – yonan2236

+0

@ yonan2236 heh; однако он подчеркивает важный момент: есть несколько доступных сериализаторов, и каждый из них имеет разные правила и форматы. –

+0

Хорошо, я попробую еще раз. Я вернусь к вам, сэр. – yonan2236

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(); 
Смежные вопросы