在camel 2.x中有marshal().serialization(),但在camel 3.x中已经没有了。在camel 3中Java对象序列化是否可行?
w46czmvw1#
您可以编写自己的处理器、Bean、DataFormat或TypeConverter来完成此操作。下面是一种使用Bean来完成此操作的方法,然后您可以在Camel路由中的任何位置重用该Bean:
@Component public class Serializer { @Handler public String serializeToBase64String(@Body Serializable inputObject) { Assert.notNull(inputObject, "Object in Exchange Body must implement Serializable!"); ByteArrayOutputStream baos = new ByteArrayOutputStream(); try (ObjectOutputStream oos = new ObjectOutputStream(baos)) { oos.writeObject(inputObject); } catch (IOException e) { // ... } return Base64.getEncoder().encodeToString(baos.toByteArray()); } }
然后要在您的Camel路线中使用,只需用途:
.bean("serializer")
而不是:
.marshal().serialization()
话虽如此,如果你能帮助它,避免序列化任何Java对象用于长期存储或应用程序之间的通信。序列化的类在存储后可能已经改变,不再工作。如果用于通信,它会在应用程序之间增加不可接受的耦合量。我们不仅强迫应用程序使用相同的语言实现(Java),甚至是要序列化/反序列化的相同版本的类,强制它们共享特定于域的模型库。相反,如果可以的话,最好使用JSON、XML或某种其他形式的语言/类不可知的通信来减少耦合。
1条答案
按热度按时间w46czmvw1#
您可以编写自己的处理器、Bean、DataFormat或TypeConverter来完成此操作。下面是一种使用Bean来完成此操作的方法,然后您可以在Camel路由中的任何位置重用该Bean:
然后要在您的Camel路线中使用,只需用途:
而不是:
话虽如此,如果你能帮助它,避免序列化任何Java对象用于长期存储或应用程序之间的通信。序列化的类在存储后可能已经改变,不再工作。如果用于通信,它会在应用程序之间增加不可接受的耦合量。我们不仅强迫应用程序使用相同的语言实现(Java),甚至是要序列化/反序列化的相同版本的类,强制它们共享特定于域的模型库。
相反,如果可以的话,最好使用JSON、XML或某种其他形式的语言/类不可知的通信来减少耦合。