2012-07-27 5 views
0

Je dois passer un objet Stream à une API qui va sérialiser certaines données dans le flux. Je ne connais pas la quantité de données à l'avance, et je n'ai aucun contrôle sur ce code. Cependant, je veux limiter la taille du flux d'un certain nombre. Puis-je faire en sorte que MemoryStream lance une exception lorsque sa longueur atteint une limite spécifiée? Quelque chose comme ceci:Comment limiter la longueur de MemoryStream?

var stream = new MemoryStream(...); // I want to specify MaxLength=10 somehow... 

for (byte i = 0; i < 9; i++) 
    stream.WriteByte(i); // ok 

stream.WriteByte(10); // this should throw 

Une façon d'atteindre ce comportement est de passer outre SetLength, recherche, écriture et méthodes de writeByte (quoi que ce soit d'autre?).

Existe-t-il une façon plus simple ou plus efficace de le faire? Ai-je manqué des constructeurs ou des propriétés existants?

+0

Quelle est l'API que vous appelez? Est-ce non géré? –

+0

Il est géré. En outre, nous pouvons supposer que l'exception générée par le flux sera gérée de manière appropriée. Ceci est juste une autre partie interne de notre projet, donc le nom de l'API ne vous dira rien. Techniquement, nous pourrions même changer l'API pour qu'elle accepte la longueur maximale en paramètre, mais j'aimerais vraiment éviter cela. – AnatoliB

+0

Vous pouvez faire quelque chose comme new MemoryStream (new byte [xxx]) (http://msdn.microsoft.com/en-us/library/e55f3s5k.aspx)? – Bert

Répondre

3
var ms = new MemoryStream(new byte[10]); 
for (byte i = 0; i <= 9; i++) 
    ms.WriteByte(i); // ok 

ms.WriteByte(10); 

Lance NotSupportedException, avec "Le flux de mémoire n'est pas extensible".

+0

Merci, cela semble assez simple et peut certainement fonctionner dans certains contextes. Dans mon cas, cependant, je m'attends à ce que la plupart des flux aient seulement quelques octets de long, et seulement de temps en temps ils atteindraient quelques mégaoctets (la limite réelle que je veux dire est d'environ 10M). En plus de cela, ce code sera appelé simultanément à partir de plusieurs threads, il est donc hors de question de préallouer cette quantité de mémoire dans mon cas. – AnatoliB

2

Si votre restriction de mémoire est très élevée et que vous ne pouvez pas (ou ne voulez pas) pré-allouer la matrice, vous pouvez simplement envelopper le MemoryStream dans une classe personnalisée Stream qui effectuera une vérification de longueur en écriture.

Veuillez noter que si vous pensez qu'une grande quantité de données doit être écrite dans MemoryStream (80Kb +), vous devrez peut-être vérifier si le modèle d'utilisation de la mémoire et les performances de MemoryStream sont acceptables pour votre application.

0

La solution que vous avez fournie est la plus simple. Vous pouvez créer votre propre flux qui hérite de MemoryStream et a un constructeur qui prend la longueur désirée en paramètre. Il suffit ensuite d'implémenter une logique supplémentaire dans les méthodes Write et ensuite d'appeler le fichier base.Write/WriteByte().

Questions connexes