Десериализация произвольных C# классов - PullRequest
0 голосов
/ 11 марта 2020

Я относительно новичок в C# и не уверен, возможно ли это с помощью этой платформы. Я sh хочу иметь программу, которая может извлекать произвольные классы с удаленного сервера и использовать их для расширения функциональности программы.

Я тестирую с двумя отдельными проектами, один из которых содержит программу, которая содержит около 20 классов, производных от одного абстрактного класса, которые были сериализованы индивидуально.

Другой проект содержит программу, которая имеет определение абстрактного базового класса и пытается десериализовать производные классы из удаленного местоположения, чтобы расширить функциональность

Я не могу заставить программу десериализации успешно десериализовать и выполнить любой из производных классов.

//the files in Project1
//ABC file
namespace Project1
{
    [Serializable] 
    public abstract class BaseClass
    {
        public abstract void RunAndWait();
    }
}

//Derived class file
namespace Project1
{
    [Serializable]
    public class DerivedClass : BaseClass
    {
        public abstract void RunAndWait()
        {
            //do stuff here
        }
    }
}

//Serialize file contents
namespace Project1
{
    public class SerializeClass
    {

        public static void Serialize(BaseClass c)
        {
            string path = "/some/path/DERIVEDCLASS.bin"
            IFormatter formatter = new BinaryFormatter();
            Stream stream = new FileStream(path,FileMode.Create,FileAccess.Write);
            formatter.Serialize(stream, c);
            stream.Close();
        }
    }
}

В другом проекте я смогу sh чтобы динамически расширять функциональность программы путем десериализации классов по мере необходимости.

//the files in project2
//ABC file in project2
namespace Project2
{
    [Serializable] 
    public abstract class BaseClass
    {
        public abstract void RunAndWait();
        //stuff goes here
    }
}

//main file in project2
namespace Project2
{
    class Program
    {
        static void Main(string[] args)
        {
            string readfile = "/some/path/DERIVEDCLASS.bin";
            FileStream fs = new FileStream(readfile, FileMode.Open);
            try
            {
                BinaryFormatter formatter = new BinaryFormatter();
                formatter.Binder = new PreMergeToMergedDeserializationBinder();
/*this is what fails*/ 
                BaseTechClass c = (BaseTechClass) formatter.Deserialize(fs);
                c.RunAndWait();
            }
            catch (SerializationException e)
            {
                Console.WriteLine("Failed. Reason: " + e.Message);
                throw;
            }
            finally
            {
                fs.Close();
            } 
        }
    }
}

//Read i needed to do a serialization binder to rename the assembly
sealed class PreMergeToMergedDeserializationBinder : SerializationBinder
{
    public override Type BindToType(string assemblyName, string typeName)
    {
        Type typeToDeserialize = null;
        String exeAssembly = Assembly.GetExecutingAssembly().FullName;
        Console.WriteLine("exeAssembly is: "+exeAssembly);
        typeToDeserialize = Type.GetType(String.Format("{0}, {1}",
            typeName, exeAssembly));
        Console.WriteLine("type is: "+typeToDeserialize.ToString());
        return typeToDeserialize;
    }
}

Я получаю такие ошибки, как Failed to deserialize. Reason: Unable to find assembly

Я мог бы использовать некоторые рекомендации относительно того, что происходит не так. переименование сборки не работает, и я не уверен, что то, что я хочу сделать, возможно даже в C# без включения всей библиотеки DLL, в которой есть каждое определение производного класса, которое я хочу де сериализовать и использовать.

...