2012-08-13 2 views
2

я хочу сохранить Stroke в MemoryStream для этой цели используется BinaryFormatter, но когда я пытаюсь сериализации Stroke я получаю ошибку, что я не могу сериализовать Strokeкак сериализовать StrokeCollection в C#

есть ли способ сохранить инсульт в memystream или сериализовать инсульт?

здесь одна часть моего кода

int size = inkCanvas1.Strokes.Count(); 
     IFormatter formatter = new BinaryFormatter(); 
     MemoryStream stream = new MemoryStream(); 
     if (size != 0) 
     { 
      try 
      { 
       formatter.Serialize(stream, inkCanvas1.Strokes[size - 1]); 
      } 
      catch (Exception ex) 
      { 
       MessageBox.Show(ex.Message); 
      } 
     } 

спасибо.

+0

Что для типа StrokeCollection? – rene

+0

Вы можете попробовать [Сохранить] (http://msdn.microsoft.com/en-us/library/ms590544) с помощью [MemoryStream] (http://msdn.microsoft.com/en-us/library/system. io.memorystream.aspx) – Reniuz

+1

Если вы указали, что у вас есть ОШИБКА, пожалуйста, ПОКАЖИТЕ точную ошибку и/или трассировку стека. – Reniuz

ответ

6

Причина, по которой это не сработало, заключается в том, что StrokeCollection не применяется SerializableAttribute.

Но для этого вы можете использовать метод StrokeCollection.Save.

var ms = new MemoryStream(); 
using (ms) 
{ 
    StrokeCollection sc = ...; 
    sc.Save(ms); 
    ms.Position = 0; 
} 

И тогда, когда вы снова нужны StrokeCollection, вы можете использовать constructor, который принимает Stream.

+0

спасибо большое :) – infinity

+0

Почему 'use (ms)' полезно? Я видел такие вещи, как 'using (var ms = new MemoryStream())', и я понимаю, что так получается, что мусор собирается сразу после использования или даже если исключения происходят, но здесь он создается за пределами 'use'? – mtfurlan

+1

Единственное, что делает оператор 'use', это убедиться, что вызывается метод' Dispose' ресурса (даже в случае исключений). Я мог бы так же использовать 'using (var ms = new MemoryStream())', это точно то же самое. –

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