@@ -88,6 +88,39 @@ std::tuple<CryptoContext<DCRTPoly>, bool> DeserializeCCWrapper(const std::string
8888 return std::make_tuple (newob, result);
8989}
9090
91+ template <typename T, typename ST>
92+ std::string SerializeToStringWrapper (const T& obj, const ST& sertype) {
93+ std::ostringstream oss;
94+ Serial::Serialize<T>(obj, oss, sertype);
95+ return oss.str ();
96+ }
97+
98+ template <typename T, typename ST>
99+ py::bytes SerializeToBytesWrapper (const T& obj, const ST& sertype) {
100+ std::ostringstream oss (std::ios::binary);
101+ Serial::Serialize<T>(obj, oss, sertype);
102+ std::string str = oss.str ();
103+ return py::bytes (str);
104+ }
105+
106+ template <typename T, typename ST>
107+ T DeserializeFromStringWrapper (const std::string& str, const ST& sertype) {
108+ T obj;
109+ std::istringstream iss (str);
110+ Serial::Deserialize<T>(obj, iss, sertype);
111+ return obj;
112+ }
113+
114+ template <typename T, typename ST>
115+ T DeserializeFromBytesWrapper (const py::bytes& bytes, const ST& sertype) {
116+ T obj;
117+ std::string str (bytes);
118+ std::istringstream iss (str, std::ios::binary);
119+ Serial::Deserialize<T>(obj, iss, sertype);
120+ return obj;
121+ }
122+
123+
91124void bind_serialization (pybind11::module &m) {
92125 // Json Serialization
93126 m.def (" SerializeToFile" , static_cast <bool (*)(const std::string &, const CryptoContext<DCRTPoly> &, const SerType::SERJSON &)>(&Serial::SerializeToFile<DCRTPoly>),
@@ -110,6 +143,29 @@ void bind_serialization(pybind11::module &m) {
110143 py::arg (" filename" ), py::arg (" obj" ), py::arg (" sertype" ));
111144 m.def (" DeserializeEvalKey" , static_cast <std::tuple<EvalKey<DCRTPoly>,bool > (*)(const std::string&, const SerType::SERJSON&)>(&DeserializeFromFileWrapper<EvalKey<DCRTPoly>, SerType::SERJSON>),
112145 py::arg (" filename" ), py::arg (" sertype" ));
146+
147+ // JSON Serialization to string
148+ m.def (" Serialize" , &SerializeToStringWrapper<CryptoContext<DCRTPoly>, SerType::SERJSON>,
149+ py::arg (" obj" ), py::arg (" sertype" ));
150+ m.def (" DeserializeCryptoContextString" , &DeserializeFromStringWrapper<CryptoContext<DCRTPoly>, SerType::SERJSON>,
151+ py::arg (" str" ), py::arg (" sertype" ));
152+ m.def (" Serialize" , &SerializeToStringWrapper<PublicKey<DCRTPoly>, SerType::SERJSON>,
153+ py::arg (" obj" ), py::arg (" sertype" ));
154+ m.def (" DeserializePublicKeyString" , &DeserializeFromStringWrapper<PublicKey<DCRTPoly>, SerType::SERJSON>,
155+ py::arg (" str" ), py::arg (" sertype" ));
156+ m.def (" Serialize" , &SerializeToStringWrapper<PrivateKey<DCRTPoly>, SerType::SERJSON>,
157+ py::arg (" obj" ), py::arg (" sertype" ));
158+ m.def (" DeserializePrivateKeyString" , &DeserializeFromStringWrapper<PrivateKey<DCRTPoly>, SerType::SERJSON>,
159+ py::arg (" str" ), py::arg (" sertype" ));
160+ m.def (" Serialize" , &SerializeToStringWrapper<Ciphertext<DCRTPoly>, SerType::SERJSON>,
161+ py::arg (" obj" ), py::arg (" sertype" ));
162+ m.def (" DeserializeCiphertextString" , &DeserializeFromStringWrapper<Ciphertext<DCRTPoly>, SerType::SERJSON>,
163+ py::arg (" str" ), py::arg (" sertype" ));
164+ m.def (" Serialize" , &SerializeToStringWrapper<EvalKey<DCRTPoly>, SerType::SERJSON>,
165+ py::arg (" obj" ), py::arg (" sertype" ));
166+ m.def (" DeserializeEvalKeyString" , &DeserializeFromStringWrapper<EvalKey<DCRTPoly>, SerType::SERJSON>,
167+ py::arg (" str" ), py::arg (" sertype" ));
168+
113169 // Binary Serialization
114170 m.def (" SerializeToFile" , static_cast <bool (*)(const std::string&,const CryptoContext<DCRTPoly>&, const SerType::SERBINARY&)>(&Serial::SerializeToFile<DCRTPoly>),
115171 py::arg (" filename" ), py::arg (" obj" ), py::arg (" sertype" ));
@@ -130,7 +186,28 @@ void bind_serialization(pybind11::module &m) {
130186 m.def (" SerializeToFile" , static_cast <bool (*)(const std::string&, const EvalKey<DCRTPoly>&, const SerType::SERBINARY&)>(&Serial::SerializeToFile<EvalKey<DCRTPoly>>),
131187 py::arg (" filename" ), py::arg (" obj" ), py::arg (" sertype" ));
132188 m.def (" DeserializeEvalKey" , static_cast <std::tuple<EvalKey<DCRTPoly>,bool > (*)(const std::string&, const SerType::SERBINARY&)>(&DeserializeFromFileWrapper<EvalKey<DCRTPoly>, SerType::SERBINARY>),
133- py::arg (" filename" ), py::arg (" sertype" ));
134-
189+ py::arg (" filename" ), py::arg (" sertype" ));
190+
191+ // Binary Serialization to bytes
192+ m.def (" Serialize" , &SerializeToBytesWrapper<CryptoContext<DCRTPoly>, SerType::SERBINARY>,
193+ py::arg (" obj" ), py::arg (" sertype" ));
194+ m.def (" DeserializeCryptoContextString" , &DeserializeFromBytesWrapper<CryptoContext<DCRTPoly>, SerType::SERBINARY>,
195+ py::arg (" str" ), py::arg (" sertype" ));
196+ m.def (" Serialize" , &SerializeToBytesWrapper<PublicKey<DCRTPoly>, SerType::SERBINARY>,
197+ py::arg (" obj" ), py::arg (" sertype" ));
198+ m.def (" DeserializePublicKeyString" , &DeserializeFromBytesWrapper<PublicKey<DCRTPoly>, SerType::SERBINARY>,
199+ py::arg (" str" ), py::arg (" sertype" ));
200+ m.def (" Serialize" , &SerializeToBytesWrapper<PrivateKey<DCRTPoly>, SerType::SERBINARY>,
201+ py::arg (" obj" ), py::arg (" sertype" ));
202+ m.def (" DeserializePrivateKeyString" , &DeserializeFromBytesWrapper<PrivateKey<DCRTPoly>, SerType::SERBINARY>,
203+ py::arg (" str" ), py::arg (" sertype" ));
204+ m.def (" Serialize" , &SerializeToBytesWrapper<Ciphertext<DCRTPoly>, SerType::SERBINARY>,
205+ py::arg (" obj" ), py::arg (" sertype" ));
206+ m.def (" DeserializeCiphertextString" , &DeserializeFromBytesWrapper<Ciphertext<DCRTPoly>, SerType::SERBINARY>,
207+ py::arg (" str" ), py::arg (" sertype" ));
208+ m.def (" Serialize" , &SerializeToBytesWrapper<EvalKey<DCRTPoly>, SerType::SERBINARY>,
209+ py::arg (" obj" ), py::arg (" sertype" ));
210+ m.def (" DeserializeEvalKeyString" , &DeserializeFromBytesWrapper<EvalKey<DCRTPoly>, SerType::SERBINARY>,
211+ py::arg (" str" ), py::arg (" sertype" ));
135212}
136213
0 commit comments