2014-09-11 5 views
2

У меня есть небольшая библиотека, где пользователь может установить и получить свойства с помощью общего интерфейса. Таким образом, пользователь может установить каждый объект, который он или она хочет.Сделать класс сериализуемым во время выполнения

Чем я могу сохранить свойства в файловой системе, используя BinaryFormatter. С родными типами, такими как string или DateTime или ... все работает нормально. Но если пользователь имеет пользовательский класс как

class User 
{ 
    public string Name { get; set; } 
} 

, чем я получаю исключение, что class лицо не рынок, как Serializable. Если я напишу атрибут [Serializable] о моем классе, он просто отлично работает.

Мой вопрос сейчас: Есть ли способ, которым я могу объявить класс как Serializable во время выполнения? Так что, если пользователь забыл это сделать, я могу попробовать?

Код для сериализации выглядит следующим образом:

public void Save(string saveFilePath) 
{ 
    byte[] binaryData; 
    using (var memoryStream = new MemoryStream()) 
    { 
     var binaryFormatter = new BinaryFormatter(); 
     binaryFormatter.Serialize(memoryStream, AllProperties); 
     binaryData = memoryStream.ToArray(); 
    } 
    File.WriteAllBytes(saveFilePath, binaryData); 
} 
+0

Я уверен, что вы не можете, см. Http://stackoverflow.com/questions/129285/can-attributes-be-added-dynamically-in-c Было бы плохой практикой, я бы сказал, – derape

+0

вы можете использовать библиотеки, такие как http://www.sharpserializer.com/en/index.html или xmlserialisation. но, как сказал derape, это плохая практика, чтобы сделать это – user1519979

+0

Хорошо. Спасибо. Чем пользователь должен будет взять на себя ответственность за это. – Tomtom

ответ

1

атрибутов в C# являются статическими метаданные. Они не могут быть введены во время выполнения. То, что вы можете сделать, это использовать отражение на System.Type для поиска этих метаданных во время выполнения.

Пользователь, объявляющий класс, должен будет сделать это во время компиляции.