[cl-store-devel] Serialize to string stream

Chris Dean ctdean at sokitomi.com
Wed Aug 8 18:26:26 UTC 2007


"Sean Ross" <rosssd at gmail.com> writes:
> Edi Weitz' flexi-streams (http://weitz.de/flexi-streams) package
> provides all you need to get this to work.

That's a great solution, and it's what we used in the past.

Here's another solution: we are pushing large amounts of data through
cl-store so we wrote some custom stream classes for cl-store to use.
Part of our code is below -- it uses LispWorks specific classes so
you'll need to make changes if you don't use LispWorks.

(to-storage-vector (cons 123 "foo")) 
  => #(67 76 45 83 11 24 0 1 1 24 0 1 123 35 1 3 102 111 111)

Cheers,
Chris Dean


(defclass write-byte-only-stream (fundamental-stream)
  ((data :accessor data-of :initarg :data :initform nil))
  (:documentation
   "A partial stream that only supports the write-byte function."))

(defun make-write-byte-only-stream ()
  (make-instance 'write-byte-only-stream
                 :data (make-array 16
                                   :fill-pointer 0 :adjustable t
                                   :element-type '(unsigned-byte 8))))

(defmethod stream-element-type ((stream write-byte-only-stream))
  'octet)

(defmethod stream-write-byte ((stream write-byte-only-stream) byte)
  "Writes a byte by extending the underlying vector."
  (vector-push-extend byte
                      (data-of stream) 
                      (length (data-of stream)))
  byte)

(defun to-storage-vector (obj)
  (let ((out (make-write-byte-only-stream)))
    (cl-store:store obj out)
    (data-of out)))




More information about the cl-store-devel mailing list