Приведение типа X из сборки A в тип X в сборке B - PullRequest
0 голосов
/ 03 марта 2019
  • У меня есть 2 проекта в решении.(Назовите их А и Б).Они оба стали сборками.
  • У меня есть общий проект (назовите его S), на который ссылаются другие 2 проекта
  • У меня есть класс (назовите его C) в проекте S
  • Я сериализую его в проекте A
  • Я десериализирую его в проекте B
  • Я не могу привести его к C

Проблема в том, что тип десериализованного объекта«C, A», но когда я пишу код:

var c = GetDeserializedObject() as C;

c будет нулевым, потому что GetDeserializedObject() is C возвращает false.

Вопрос:

Любая идея, как я должен получить эту работу?Используйте класс C в сборке B, которая была сериализована в сборке A.

Примечания:

Я использую этот код для сериализации моего объекта:

var serialized = MessagePackSerializer.Typeless.Serialize(this);
File.WriteAllBytes(outputFilePath, serialized);

И этот код для его десериализации:

MessagePackSerializer.Typeless.Deserialize(File.ReadAllBytes(inputFilePath)) as C;

Дополнительные комментарии:

Я не могу использовать BinaryFormatter, поскольку класс C содержит несколько свойств, типы которых не являются [Serializable]

Я также пытался использовать Newtonsoft Json Serializer, но не смог прочитать данные во время десериализации.Если я сериализую это с типами, то есть несоответствие типов.Если в некоторых случаях я сериализирую их без типов, система не может создавать экземпляры типов интерфейса или абстрактных классов.Потому что мои занятия выглядят так:

class C {
    IMyInterface i;
}

class MyClass : IMyInterface { }

И я использую это так:

var c = new C {
    i = new MyClass()
};

Ответы [ 2 ]

0 голосов
/ 04 марта 2019

Вот как десериализовать:

MessagePack.Formatters.TypelessFormatter.BindToType = typeName =>
{
    var typeWithoutAssemblyName = typeName.Split(',').FirstOrDefault();
    return Type.GetType(typeWithoutAssemblyName ?? typeName, false);
};

return MessagePackSerializer.Typeless.Deserialize(File.ReadAllBytes(inputFilePath)) as C;
0 голосов
/ 03 марта 2019

Я рекомендую вам использовать сериализатор и десериализатор JSON с включенным флагом TypeNameHandlig, чтобы он позаботился о сериализации интерфейса в вашем классе C

var indented = Formatting.Indented; var settings = new JsonSerializerSettings() { TypeNameHandling = TypeNameHandling.All }; string serialized = JsonConvert.SerializeObject(wizardConf, indented, settings);

Подробные сведения здесь

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...