Использование с использованием - это правильно, но ваш код, похоже, дублирует один и тот же контент несколько раз (чего не следует делать).
requestObjectStream
превращается вstring
, который затем превращается в byte[]
перед записью в другой поток.И это без с учетом того, что дополнительный код (например, ReadToEnd
и UTF8Encoding.GetBytes
) может распределить самостоятельно (например, как больше строк , байт [] ...).
Так что, если то, что вы сериализуете, велико, то вы будете использовать много дополнительной памяти (даром).Это даже немного хуже для string
и byte[]
, так как вы не можете утилизировать их вручную (GC примет решение, когда, затрудняя измерение).
Я бы попробовал (но не сделал ;-) что-то вроде:
...
using (Stream requestObjectStream = new MemoryStream ()) {
DataContractSerializer serializedObject = new DataContractSerializer(typeof(T));
serializedObject.WriteObject(requestObjectStream, requestObject);
requestObjectStream.Position = 0;
invokeRequest.ContentLength = requestObjectStream.Length;
using (Stream postStream = invokeRequest.GetRequestStream())
requestObjectStream.CopyTo (postStream);
}
...
Это позволило бы MemoryStream
скопировать себя в поток запросов.Альтернативой является вызов ToArray
для MemoryStream
(но это еще одна копия сериализованного объекта, которую GC должен будет отследить и освободить).