How do you serialize a Stream (or more correctly Stream derived) data member of a class?
Assuming we have a 3rd Party class that we can\'t attribute:
pub
Not to make Marc claw his own hands off... but in case anyone else wants to create a surrogate for Stream I've adapted Marc's surrogate example from the answer:
[ProtoContract]
public class StreamSurrogate
{
[ProtoMember(1)]
public byte[] Data { get; set; }
public static explicit operator Stream(StreamSurrogate value)
{
if (value == null)
{
return null;
}
return new MemoryStream(value.Data);
}
public static explicit operator StreamSurrogate(Stream value)
{
if (value == null)
{
return null;
}
if (value is MemoryStream)
{
return new StreamSurrogate { Data = ((MemoryStream)value).ToArray() };
}
else
{
// Probably a better way to do this...
StreamSurrogate ss = new StreamSurrogate();
ss.Data = new byte[value.Length];
value.Read(ss.Data, 0, (int)value.Length);
return ss;
}
}
}
And then for the RuntimeTypeModel:
MetaType mt2 = RuntimeTypeModel.Default.Add(typeof(Stream), true);
mt2.AddSubType(1, typeof(MemoryStream));
mt2.SetSurrogate(typeof(StreamSurrogate));
In which case f2 in my example appears to be fully correct!
Yes there are a lot of potential troubles with trying to serialize Stream - perhaps it would be wiser for me to set the surrogate on the MemoryStream subtype only since I know my particular case will always be using MemoryStreams for Data. However my line of thinking for registering the surrogate on Stream is as follows: