> What could be done to avoid the overhead is to have a method on the
> server that creates the byte array server side, then sends it back
> across to the client.
> 
> byte[] Read(int offset, int count, int bufferSize, out int bytesRead)
> {
>   byte[] buffer = new byte[bufferSize];
> 
>   bytesRead = myStream.Read(buffer, offset, count);
> 
>   return buffer;
> }

that would help, but then I couldn't use the stream in any stream context (e.g. 
BufferedStream), because I added a Methode not known by other Stream consumers. I had 
to wrap the Stream Proxy in a new Stream class and forward all calls to the proxy, 
except the Read, which I had to rewrite like suggested above.

this would look like:

        WrapperStream ws=     new WrapperStream(remoteserver.GetStream());
        ws->Read(buffer,0,1024*1024)            

        and would ony work for exactly my stream because the new 
        methode 
                byte[] Read(int offset, int count, int bufferSize, out int bytesRead) 
        is not in the Stream class.
Dirk


> 
> James
> 
> > -----Original Message-----
> > From: Moderated discussion of advanced .NET topics.
> > [mailto:[EMAIL PROTECTED]] On Behalf Of
> > Axel Heitland
> > Sent: Thursday, August 15, 2002 12:24 PM
> > To: [EMAIL PROTECTED]
> > Subject: Re: [ADVANCED-DOTNET] Why has a MarshallByRefObject
> > Stream.Read(..) byte[] as IN Parameter
> >
> >
> > Hmm...
> >
> > What he has is a Stream at the server....
> >
> > So a read should surely transfer back the results to the
> > client (the [out] direction).
> >
> > The error is that the client unnecessarily uploads the bytes
> > to the server. This behaviour is time- and bandwidth consuming.
> >
> > Since Stream extends MarshalByRefObject it looks like the
> > Stream methods are not optimal modelled for remoting...
> >
> > If true that is a little bit more than just a documentation 
> error ;-))
> >
> > My regards
> >         Axel
> >
> > -----Original Message-----
> > From: Stefan Holdermans [mailto:[EMAIL PROTECTED]]
> > Sent: Donnerstag, 15. August 2002 14:52
> > To: [EMAIL PROTECTED]
> > Subject: Re: [ADVANCED-DOTNET] Why has a MarshallByRefObject
> > Stream.Read(..) byte[] as IN Parameter
> >
> >
> > Dirk,
> >
> > Actually, the correct CIL signature for Stream.Read is:
> >
> > .method public hidebysig newslot virtual abstract
> >         instance int32 Read([in][out] unsigned int8[] buffer,
> >                             int32 offset,
> >                             int32 count) cil managed
> > {
> > }
> >
> > The corresponding C# syntax for this is :
> >
> > public abstract int Read(ref byte[] buffer, int offset, int count);
> >
> > in is not a valid parameter modifier in C#; so, I guess, this
> > qualifies as a documentation error.
> >
> > Anyway, the out modifier causes the buffer to be transferred
> > back. To avoid this, you can provide a wrapper for the Read
> > method on your server component.
> >
> > HTH,
> >
> > Stefan
> >   ----- Original Message -----
> >   From: Dirk Reuss
> >   To: [EMAIL PROTECTED]
> >   Sent: Wednesday, August 14, 2002 1:05 PM
> >   Subject: Why has a MarshallByRefObject Stream.Read(..)
> > byte[] as IN Parameter
> >
> >
> >   Hello,
> >   I implemented a Stream for transfering data over the network.
> >   On the remote (client) side I have a proxy to a stream object.
> >
> >   Client Code:
> >   Stream stream = remoteserverobject.GetStream();
> >   byte [] buffer = new byte[1024*1024];
> >   stream.Read(buffer,0,1024*1024) ;
> >
> >   The buffer is transferd (1MB) from the client to the server
> > and if the Read
> >   call returns the buffer is transfered back (OK). So the
> > network volumn is
> >   2MB.IMO that's 1MB to much.
> >
> >   The signature for Read is:
> >
> >   [C#]
> >   [Serializable]
> >   public abstract int Read(
> >      in byte[] buffer,
> >      int offset,
> >      int count
> >   );
> >
> >   The buffer parameter is explicitly marked as in. I couldn't
> > understand why.
> >   I think this happens not only for my channel.
> >   Is there any workaround with remoting attributes?
> >   Interop Marshalling Attributes don't work.
> >   The transport is Tcpip with TcpIpChannel.
> >
> >   I tried:
> >   byte [] buffer = new byte[0];
> >   stream.Read(buffer,0,1024*1024) ;
> >
> >   Stream::Read(byte[] buffer...)
> >   {
> >
> >   }
> >
> >
> >   Regards,
> >   Dirk
> >
> >   You can read messages from the Advanced DOTNET archive,
> > unsubscribe from Advanced DOTNET, or
> >   subscribe to other DevelopMentor lists at
> > http://discuss.develop.com.
> >
> >
> > You can read messages from the
> > Advanced DOTNET archive, unsubscribe from Advanced DOTNET, or
> > subscribe to other DevelopMentor lists at 
http://discuss.develop.com.
>
> You can read messages from the Advanced DOTNET archive,
> unsubscribe from Advanced DOTNET, or subscribe to other
> DevelopMentor lists at http://discuss.develop.com.
>

You can read messages from the Advanced DOTNET archive, unsubscribe from Advanced 
DOTNET, or
subscribe to other DevelopMentor lists at http://discuss.develop.com.

You can read messages from the Advanced DOTNET archive, unsubscribe from Advanced 
DOTNET, or
subscribe to other DevelopMentor lists at http://discuss.develop.com.

Reply via email to