Страницы

Поиск по вопросам

вторник, 31 декабря 2019 г.

Как пометить класс как [Serializable] ,если он подгружается из dll

#c_sharp #сериализация #serializable


Я использую dll файлы в моем проекте. Как пометить класс как сериализуемый атрибутом
[serializable].
Я не имею исходного кода, только dll файл, на который есть ссылка в моем классе.
Я хочу сделать его сериализуемым, чтобы использовать состояние представления для
моего объекта, который использует dll. Использую бинарную сериализацию.
Как решить проблему?
    


Ответы

Ответ 1



Если вы можете вручную, кодом, извлечь из такого объекта все нужные свойства, то можно использовать механизм Surrogate Selector. Код честно взят из MSDN. Employee - тот самый "внешний" класс, на который нельзя поставить [Serializable]: using System; using System.IO; using System.Runtime.Serialization; using System.Runtime.Serialization.Formatters; using System.Runtime.Serialization.Formatters.Binary; // This class is not serializable. class Employee { public String name, address; public Employee(String name, String address) { this.name = name; this.address = address; } } // This class can manually serialize an Employee object. sealed class EmployeeSerializationSurrogate : ISerializationSurrogate { // Serialize the Employee object to save the object's name and address fields. public void GetObjectData(Object obj, SerializationInfo info, StreamingContext context) { Employee emp = (Employee) obj; info.AddValue("name", emp.name); info.AddValue("address", emp.address); } // Deserialize the Employee object to set the object's name and address fields. public Object SetObjectData(Object obj, SerializationInfo info, StreamingContext context, ISurrogateSelector selector) { Employee emp = (Employee) obj; emp.name = info.GetString("name"); emp.address = info.GetString("address"); return null; } } public sealed class App { static void Main() { // This sample uses the BinaryFormatter. IFormatter formatter = new BinaryFormatter(); // Create a MemoryStream that the object will be serialized into and deserialized from. using (Stream stream = new MemoryStream()) { // Create a SurrogateSelector. SurrogateSelector ss = new SurrogateSelector(); // Tell the SurrogateSelector that Employee objects are serialized and deserialized // using the EmployeeSerializationSurrogate object. ss.AddSurrogate(typeof(Employee), new StreamingContext(StreamingContextStates.All), new EmployeeSerializationSurrogate()); // Associate the SurrogateSelector with the BinaryFormatter. formatter.SurrogateSelector = ss; try { // Serialize an Employee object into the memory stream. formatter.Serialize(stream, new Employee("Jeff", "1 Microsoft Way")); } catch (SerializationException e) { Console.WriteLine("Serialization failed: {0}", e.Message); throw; } // Rewind the MemoryStream. stream.Position = 0; try { // Deserialize the Employee object from the memory stream. Employee emp = (Employee) formatter.Deserialize(stream); // Verify that it all worked. Console.WriteLine("Name = {0}, Address = {1}", emp.name, emp.address); } catch (SerializationException e) { Console.WriteLine("Deserialization failed: {0}", e.Message); throw; } } } } // This code produces the following output. // // Name = Jeff, Address = 1 Microsoft Way т.е. сериализоваться будет класс без аттрибута [Serializable], но как именно его сериализовать - вам придется описать самому.

Ответ 2



Атрибуты класса лежат в метаданных, которые лежат внутри скомпилированной сборки, то есть пометить класс как [Serializable] у вас не получится. Пользуйтесь сериализатором, который не смотрит на эти аттрибуты.

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

Отправить комментарий