2017-07-13 4 views
1

Also habe ich nicht den Code geschrieben, den ich gerade behandle, und ich schaue, wie man das am besten behandelt.Wie verhindert man, dass Newtonsoft JsonSerializer den Stream schließt?

Gerade jetzt habe ich das.

public static void WriteSymbol(Stream stream, Symbol symbol) 
{ 
    using (var streamWriter = new StreamWriter(stream)) 
    { 
     JsonSerializer.Create(SerializerSettings).Serialize(streamWriter, symbol);     
    } 
} 

Ich möchte den Inhalt des Stroms in der Lage sein zu lesen, nachdem dies in meinem Test durchgeführt wird, so dass ich die Integration überprüfen. Das Problem ist, dass der Stream nach dem Serialisieren jetzt geschlossen ist und ich nicht mehr lesen kann.

Ich sehe, dass JsonWriter public bool CloseOutput { get; set; }, aber ich sehe nichts für diese statische JsonSerializer.

Was wäre der beste Weg, dies zu tun? Wie verhindere ich, dass der Serializer den Stream schließt? Gibt es eine Möglichkeit, den Inhalt des Streams zu überprüfen?

+1

Sind Sie sicher, dass es der Serializer ist, der es schließt? –

+3

Mögliches Duplikat von [Gibt es eine Möglichkeit, einen StreamWriter zu schließen, ohne dessen BaseStream zu schließen?] (Https://stackoverflow.com/questions/2666888/is-there-any-way-to-close-a-streamwriter-without- closing-its-basestream) –

+2

Ich vermute stark, dass 'StreamWriter' das Ding ist, das es hier schließt ... siehe die Frage, mit der @JeffE verlinkt ist - es gibt eine sehr gute Chance, dass es dich sortiert –

Antwort

4

Von .net 4.5 aufwärts können Sie das LeaveOpen Konstruktorargument von StreamWriter verwenden.

Die vom StreamWriter verwendete Standardpuffergröße ist 1024, wenn der Typ dekompiliert wird.

So können Sie Folgendes tun.

using (var streamWriter = new StreamWriter(stream, Encoding.UTF8, 1024, true)) 
{ 
    // TODO: do something 
} 
0

versuchen, etwas wie folgt aus:

public static void WriteSymbol(Stream stream, Symbol symbol) 
{ 
    using (var streamWriter = new StreamWriter(stream)) 
    { 
     JsonSerializer.Create(SerializerSettings).Serialize(streamWriter, symbol); 
     // test stream here    
    } 
} 

Oder diesen Anruf nicht umgeben mit einer using-Anweisung und dann den Strom in der Nähe außerhalb dieses Verfahrens.

+0

Das Problem mit der Verwendung eines 'using' hier ist, dass viele Stream Decorators/etc Dinge puffern - wenn Sie nicht vollständig diejenigen sie runter, können sie nicht flush (auch' Flush() 'macht nicht immer einen vollständigen Flush) –

+0

Ich habe nicht vorgeschlagen, dass er den Stream nicht schließt, nur dass er das tut, nachdem er getestet hat, was immer er auch testen will. – jlavallet

+0

Ich nehme an, die 'StreamWriter' nur in der using-Anweisung ist gegen die Idee des Autors. – NtFreX

Verwandte Themen