2012-05-17 6 views
1

по некоторым причинам мне нужно управлять процессом сериализации объектов в .NET. Я должен контролировать, что свойства должны быть сериализованы. Этот процесс должен быть динамическим, поэтому, по одному запросу, один набор свойств должен быть сериализован, а другой - другой. Мне любопытно, можно ли реализовать уже существующий механизм, или мне нужно разработать какой-то пользовательский сериализатор?Управляемая сериализация в .NET

ответ

1

Интерфейс ISerializable позволяет сделать именно это. В основном, вы контролируете, какие значения добавляются в «сумку свойств» (SerializationInfo), когда выполняется сериализация. Обратите внимание, что вы даже не ограничены свойствами этого типа, как показано ниже.

public class StackOverflow_10639264 
{ 
    [Serializable] 
    public class MyType : ISerializable 
    { 
     public string SerializedAM { get; set; } 
     public string SerializedPM { get; set; } 
     public void GetObjectData(SerializationInfo info, StreamingContext context) 
     { 
      DateTime now = DateTime.Now; 
      if (now.Hour < 12) 
      { 
       info.AddValue("MyValue", this.SerializedAM); 
      } 
      else 
      { 
       info.AddValue("MyValue", this.SerializedPM); 
       info.AddValue("NotAProperty", "Hello"); 
      } 
     } 
    } 
    public static void Test() 
    { 
     MemoryStream ms = new MemoryStream(); 
     DataContractSerializer dcs = new DataContractSerializer(typeof(MyType)); 
     dcs.WriteObject(ms, new MyType { SerializedAM = "AM", SerializedPM = "PM" }); 
     Console.WriteLine(Encoding.UTF8.GetString(ms.ToArray())); 
    } 
} 
+0

благодарит за быстрый ответ! Похоже, это именно то, что мне нужно! –

+0

еще один вопрос ... как передать свои собственные параметры внутри GetObjectData? Какая хорошая практика? Мне нужно передать туда какой-то объект, который будет описывать, какие свойства должны быть сериализованы ... –

+0

GetObjectData - это метод экземпляра, поэтому он имеет доступ ко всем членам типа, который содержит его (в примере выше, 'MyType'). Если вы хотите определить, что должно быть сериализовано, вы можете сохранить его в некотором поле/свойство в самом типе. – carlosfigueira

Смежные вопросы