func (s *Serializer) StartStream(file *os.File, base_uri string) (err error) {
	var buri *C.raptor_uri

	s.mutex.Lock()
	defer s.mutex.Unlock()

	if s.running {
		err = errors.New("serializer already running")
		return
	}
	s.running = true

	if len(base_uri) > 0 {
		cbase_uri := C.CString(base_uri)
		buri = C.raptor_new_uri(s.world, (*C.uchar)(unsafe.Pointer(cbase_uri)))
		C.free(unsafe.Pointer(cbase_uri))
		// XXX LEAK defer C.raptor_free_uri(buri)
	}

	cwb := C.CString("wb")
	fh, err := C.fdopen(C.int(file.Fd()), cwb)
	C.free(unsafe.Pointer(cwb))
	if fh == nil {
		err = errors.New("fdopen: ...")
		return
	}
	s.fh = fh

	if C.raptor_serializer_start_to_file_handle(s.serializer, buri, s.fh) != 0 {
		err = errors.New("raptor_serializer_start_to_file_handle failed")
		return
	}

	return
}
func (s *Serializer) SetFile(fp *os.File, base_uri string) (err error) {
	s.mutex.Lock()
	defer s.mutex.Unlock()

	mode := C.CString("w")
	fh, err := C.fdopen(C.int(fp.Fd()), mode) // do something better with mode?
	C.free(unsafe.Pointer(mode))
	if err != nil {
		return
	}
	s.fh = fh

	var buri *C.raptor_uri
	if len(base_uri) > 0 {
		cbase_uri := C.CString(base_uri)
		buri = C.raptor_new_uri(s.world, (*C.uchar)(unsafe.Pointer(cbase_uri)))
		C.free(unsafe.Pointer(cbase_uri))
		defer C.raptor_free_uri(buri)
	}
	if C.raptor_serializer_start_to_file_handle(s.serializer, buri, s.fh) != 0 {
		err = errors.New("C.raptor_serializer_start_to_file_handle failed")
		return
	}

	s.running = true

	return
}