Порядок десериализации C #

#c# #serialization

#c# #сериализация

Вопрос:

у меня есть эти три типа, например:

 public class Type1 : ISerializable
{
    public List<Type2> field2 { set; get; }

    public void GetObjectData(SerializationInfo info, StreamingContext context)
    {
        info.AddValue("field2", field2, typeof (List<Type2>));
    }

    protected Type1(SerializationInfo info, StreamingContext context)
    {
        this.field2 = (List<Type2>) info.GetValue("field2", typeof (List<Type2>));
    }
}

public class Type2 : ISerializable
{
    public List<Type3> field3 { set; get; }

    public void GetObjectData(SerializationInfo info, StreamingContext context)
    {
        info.AddValue("field3", field3, typeof (List<Type3>));
    }

    protected Type2(SerializationInfo info, StreamingContext context)
    {
        this.field3 = (List<Type3>) info.GetValue("field3", typeof (Type3));
    }
}

public class Type3 : ISerializable
{
    public string field;

    public void GetObjectData(SerializationInfo info, StreamingContext context)
    {
        info.AddValue("field", field, typeof (string));
    }

    protected Type3(SerializationInfo info, StreamingContext context)
    {
        this.field = (string) info.GetValue("field", typeof (string));
    }
}
  

во время десериализации объекта Type1, например, сначала десериализуется объект type3, а затем
десриализуется type1, а затем Type2. Мне нужна эта дисциплина:
Сначала выполните десриализацию типа 1, затем введите 2, а затем введите 3.
как я могу это сделать?
примечание: Это не мой код, и я это не тестирую, но мой код такой. из-за его объема я не включаю это в свой пост…

Комментарии:

1. почему порядок десериализации имеет значение?

2. из-за восстановления некоторых отношений родитель-потомок…

Ответ №1:

Это звучит так, как будто вам нужно создать общий сериализуемый класс, в котором вы управляете сериализацией в требуемом порядке, что-то вроде этого:

 public class TypePrimary : ISerializable{
    private Type1 _type1;
    private Type2 _type2;
    private Type3 _type3;
    protected TypePrimary(Type1 type1, Type2, type2, Type3 type3){
        this._type1 = type1;
        this._type2 = type2;
        this._type3 = type3;
    }
    public void GetObjectData(SerializationInfo info, StreamingContext context)
    {
        info.AddValue("type1", this._type1, typeof (Type1));
        info.AddValue("type2", this._type2, typeof (Type2));
        info.AddValue("type3", this._type3, typeof (Type3));
    }

    protected TypePrimary(SerializationInfo info, StreamingContext context)
    {
        this._type1 = (Type1) info.GetValue("type1", typeof (Type1));
        this._type2 = (Type2) info.GetValue("type2", typeof (Type2));
        this._type3 = (Type3) info.GetValue("type3", typeof (Type3));
    }
    // Use public getters to return the types...
}
  

Остальные поля также будут сериализованы … считайте это оболочкой вокруг него, чтобы поддерживать требуемую согласованность..

Ответ №2:

Похоже, что есть встроенная функция для указания порядка во время сериализации:

https://learn.microsoft.com/en-us/dotnet/framework/wcf/feature-details/data-member-order

Я думаю, что пример не требует пояснений:

 [DataContract]
public class BaseType
{

    [DataMember]
    public string zebra;
}
[DataContract]
public class DerivedType : BaseType
{
    [DataMember(Order = 0)]
    public string bird;
    [DataMember(Order = 1)]
    public string parrot;
    [DataMember]
    public string dog;
    [DataMember(Order = 3)]
    public string antelope;
    [DataMember]
    public string cat;
    [DataMember(Order = 1)]
    public string albatross;
}