From ripley at stats.ox.ac.uk  Fri Mar 31 18:48:35 2006
From: ripley at stats.ox.ac.uk (Prof Brian Ripley)
Date: Fri, 31 Mar 2006 17:48:35 +0100 (BST)
Subject: [Rd] Writing character vectors with embedded nulls to a
	connection
In-Reply-To: <Pine.LNX.4.64.0603310831490.707@gannet.stats.ox.ac.uk>
References: <442C5D06.20309@vanderbilt.edu>
	<Pine.LNX.4.64.0603310831490.707@gannet.stats.ox.ac.uk>
Message-ID: <Pine.LNX.4.64.0603311721420.11998@gannet.stats.ox.ac.uk>

The following approach

sobject <- charToRaw(serialize(object,NULL))
len <- length(sobject)
writeBin(sobject, outcon)

would appear to work.  As from 2.3.0 you will then be able to do

unserialize(readBin(incon, "raw", n=len))


On Fri, 31 Mar 2006, Prof Brian Ripley wrote:

> I think you should be using a raw type to hold such data in R.  It is not 
> intentional that readChar handles embedded nuls (and in fact it might not in 
> an MBCS).
>
> As ?serialize says
>
>     For 'serialize', 'NULL' unless 'connection=NULL', when the result
>     is stored in the first element of a character vector (but is not a
>     normal character string unless 'ascii = TRUE' and should not be
>     processed except by 'unserialize').
>
> so you have been told this is not intended to work as you tried.
>
> serialize predates the raw type, or it would have made use of it.  In these 
> days of MBCS character strings it is increasingly unsafe to use them to hold 
> anything other than valid character data.
>
>
> On Thu, 30 Mar 2006, Jeffrey Horner wrote:
>
>> Is this possible? I've tried both writeChar() and writeBin() to no avail.
>> 
>> My goal is to serialize(ascii=FALSE) an object to a connection but
>> determine the size of the serialized object before hand:
>> 
>> sobject <- serialize(object,NULL,ascii=FALSE)
>> len <- nchar(sobject)
>> #
>> # run some code here to notify listener on other end of connection
>> # how many bytes I'm getting ready to send
>> #
>> writeChar(sobject,con)
>> 
>> The other option is to serialize twice:
>> 
>> len <- nchar(serialize(object,NULL,ascii=FALSE))
>> #
>> # run some code here to notify listener on other end of connection
>> # how many bytes I'm getting ready to send
>> #
>> serialize(object,con,ascii=FALSE)
>> 
>> Object stores, like memcache (http://danga.com/memcached/), need to know
>> object sizes before storing. RDBMS's which support large objects (CLOBS
>> or BLOBS) don't nececarilly need to know object sizes before-hand, but
>> they do have max column size limits which must be honored.
>> 
>> BTW, readchar() can read strings with embedded nulls; I figured
>> writeChar() should be able to write them.
>> 
>> 
>
>

-- 
Brian D. Ripley,                  ripley at stats.ox.ac.uk
Professor of Applied Statistics,  http://www.stats.ox.ac.uk/~ripley/
University of Oxford,             Tel:  +44 1865 272861 (self)
1 South Parks Road,                     +44 1865 272866 (PA)
Oxford OX1 3TG, UK                Fax:  +44 1865 272595



[Rd] Writing character vectors with embedded nulls to a connection
Prof Brian Ripley