Десериализация в режиме отладки? - PullRequest
0 голосов
/ 15 сентября 2009

Может кто-нибудь объяснить, почему происходит следующее:

Когда мы сериализуем файл в режиме отладки, мы можем открыть его снова в режиме отладки, но не во время выполнения. Когда мы сериализуем файл в режиме выполнения, мы можем снова открыть его в режиме выполнения, но не в режиме отладки.

Теперь я знаю, что вы скажете: это потому, что у них разные сборки. Но мы используем пользовательский Binder, как указано ниже ... Кроме того, если мы сравним оба типа, «bool same = (o.GetType () == c.GetType ())», мы получим всегда «true» как результат ???

Тогда почему мы не можем открыть файл ??

public class Binder : SerializationBinder {

    public override Type BindToType(string assemblyName, string typeName) {
        Type tyType = null;
        string sShortAssemblyName = assemblyName.Split(',')[0];
        Assembly[] ayAssemblies = AppDomain.CurrentDomain.GetAssemblies();
        if (sShortAssemblyName.ToLower() == "debugName")
        {
            sShortAssemblyName = "runtimeName";
        }
        foreach (Assembly ayAssembly in ayAssemblies) {
            if (sShortAssemblyName == ayAssembly.FullName.Split(',')[0]) {
                tyType = ayAssembly.GetType(typeName);
                break;
            }
        }
        return tyType;
    }
}



    public static DocumentClass Read(string fullFilePath, bool useSimpleFormat)
    {
        DocumentClass c = new DocumentClass();
        c.CreatedFromReadFile = true;

        Stream s = File.OpenRead(fullFilePath);// f.Open(FileMode.Open);
        BinaryFormatter b = new BinaryFormatter();
        if (useSimpleFormat)
        {
            b.AssemblyFormat = System.Runtime.Serialization.Formatters.FormatterAssemblyStyle.Simple;
        }
        b.Binder = new Binder();

        try
        {
            object o = b.Deserialize(s);
            c = (DocumentClass)o;
            c.CreatedFromReadFile = true;

           string objOriginal = o.GetType().AssemblyQualifiedName + "_" + o.GetType().FullName;
            string objTarget = c.GetType().AssemblyQualifiedName + "_" + c.GetType().FullName;
            bool same = (o.GetType() == c.GetType());

            if (c.DocumentTypeID <= 0)
            {
                throw new Exception("Invalid file format");
            }
        }
        catch( Exception exc )
        {
            s.Close();
            if (!useSimpleFormat)
            {
                return Read(fullFilePath, true);
            }
            throw exc;

        }
        finally
        {
            s.Close();
        }
        return c;
    }

Ответы [ 3 ]

4 голосов
/ 15 сентября 2009

о нет ... я идиот ...

некоторые поля класса запутываются в режиме выполнения ...

  • бьет головой в стол *

извините, люди ... спасибо за помощь ...

1 голос
/ 15 сентября 2009

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

class Foo {
#if DEBUG
  int Bar;
#endif
}

Если это так, вы не сможете десериализовать его автоматически.

У вас есть 2 варианта.

  1. Не использовать условную компиляцию для сериализованных типов - или -
  2. Предоставьте пользовательский сериализатор, добавив сериализуемый конструктор.
0 голосов
/ 15 сентября 2009

Сначала простой вопрос - выполняете ли вы с одинаковыми учетными данными как во время выполнения, так и в режиме отладки?

...