kann uns jemand sagen, was ist falsch mit diesem Code unten? Wir haben hier einen Objekt-Serializer, der eine XML-Zeichenfolge von jedem Objekt zurückgegeben sollte, die an es übergeben wird.MemoryStream Leck
wir haben uns über diesen Kopf gekratzt, da wir ein Programm haben, das dies mehrmals anruft und wir sehen, wie unser Speicherverbrauch in den Himmel steigt (und dort bleibt, auch nachdem das Programm fertig war) Suche durchgeführt, aber ohne Erfolg. Das stream-Objekt befindet sich in einer "using" -Anweisung, also dachten wir, dass dies auf eigene Faust geschehen sollte.
public static string ToXML(this IMessage m)
{
try
{
var serializer = SerializerFactory.Create(m.GetType());
using (var stream = new MemoryStream())
{
serializer.Serialize(new[] { m }, stream);
stream.Position = 0;
var s = Encoding.ASCII.GetString(stream.ToArray());
return s;
}
}
catch (Exception e)
{
return string.Format("Message unserializable: {0}", e.Message);
}
}
btw sieht SerializerFactory wie folgt aus:
public class SerializerFactory
{
public static IMessageSerializer Create(Type t)
{
var types = new List<Type> { t };
var mapper = new MessageMapper();
mapper.Initialize(types);
var serializer = new XmlMessageSerializer(mapper);
serializer.Initialize(types);
return serializer;
}
}
Vielleicht gibt es keinen Speicherdruck, so dass der GC es einfach macht. – ChaosPandion
Hier scheint nichts offensichtlich falsch zu sein. Haben Sie versucht, es über einen Speicherprofiler auszuführen? – Dervall
Alle Ausnahmen werden ausgelöst? Sie übergeben den Stream an den Serializer-Aufruf. Also habe ich ein wenig Zweifel dort, ich meine über Streams Leben Zeit wird weit über seine Verwendung() Gebietsschema erweitert. – Zenwalker