qsadfasdgfgads

Untitled

May 20th, 2023
91
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 6.67 KB | None | 0 0
  1.  
  2. package org.example;
  3.  
  4. import com.fasterxml.jackson.annotation.*;
  5. import com.fasterxml.jackson.core.JsonGenerator;
  6. import com.fasterxml.jackson.core.JsonToken;
  7. import com.fasterxml.jackson.core.type.WritableTypeId;
  8. import com.fasterxml.jackson.databind.*;
  9. import com.fasterxml.jackson.databind.jsontype.TypeSerializer;
  10. import com.fasterxml.jackson.databind.ser.BeanSerializerModifier;
  11. import com.fasterxml.jackson.dataformat.xml.XmlMapper;
  12. import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlProperty;
  13. import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlRootElement;
  14. import org.example.TextMessage;
  15.  
  16. import java.io.IOException;
  17. import java.io.Serializable;
  18.  
  19. public class Main {
  20. public static void main(String[] args) throws IOException {
  21. XmlMapper xmlMapper = new XmlMapper();
  22. xmlMapper.setSerializerFactory(xmlMapper.getSerializerFactory()
  23. .withSerializerModifier(new ServerMessageSerializerModifier()));
  24.  
  25. ServerMessage.LoginResponse loginResponse = new ServerMessage.LoginResponse(12345);
  26. String serializedLoginResponse = xmlMapper.writeValueAsString(loginResponse);
  27. System.out.println("Serialized LoginResponse: " + serializedLoginResponse);
  28. }
  29. }
  30.  
  31. @JacksonXmlRootElement(localName = "ServerMessage")
  32. @JsonTypeInfo(use = JsonTypeInfo.Id.NAME, include = JsonTypeInfo.As.PROPERTY, property = "type")
  33. @JsonSubTypes({
  34. @JsonSubTypes.Type(value = ServerMessage.LoginResponse.class, name = "login_response"),
  35. @JsonSubTypes.Type(value = ServerMessage.NewMessage.class, name = "new_message")
  36. })
  37. abstract class ServerMessage implements Serializable {
  38. public enum ErrorType {
  39. ERROR, SUCCESS
  40. }
  41.  
  42.  
  43. @JsonIgnore
  44. @JacksonXmlProperty(isAttribute = false)
  45. private final ErrorType errorType;
  46.  
  47. @JsonCreator
  48. protected ServerMessage(@JsonProperty("errorType") ErrorType errorType) {
  49. this.errorType = errorType != null ? errorType : ErrorType.SUCCESS;
  50. }
  51. @JsonIgnore
  52. public ErrorType getErrorType() {
  53. return errorType;
  54. }
  55.  
  56. public static final class LoginResponse extends ServerMessage {
  57. private final int sessionID;
  58.  
  59. public LoginResponse(int sessionId) {
  60. super(ErrorType.SUCCESS);
  61. this.sessionID = sessionId;
  62. }
  63.  
  64. @JsonCreator(mode = JsonCreator.Mode.DISABLED)
  65. public LoginResponse() {
  66. super(ErrorType.SUCCESS);
  67. this.sessionID = 0; // or any default value you prefer
  68. }
  69.  
  70. @JsonProperty("sessionID")
  71. @JacksonXmlProperty(localName = "sessionID")
  72. public int getSessionID() {
  73. return sessionID;
  74. }
  75. }
  76.  
  77. public static final class NewMessage extends ServerMessage {
  78. private TextMessage message;
  79.  
  80. public NewMessage() {
  81. super(ErrorType.SUCCESS);
  82. }
  83.  
  84. public NewMessage(TextMessage message) {
  85. super(ErrorType.SUCCESS);
  86. this.message = message;
  87. }
  88.  
  89. @JsonProperty("message")
  90. @JacksonXmlProperty(localName = "message")
  91. public TextMessage getMessage() {
  92. return message;
  93. }
  94. }
  95.  
  96. public static String serialize(ServerMessage message) throws IOException {
  97. XmlMapper xmlMapper = new XmlMapper();
  98. return xmlMapper.writer().withRootName(message.getErrorType().name()).writeValueAsString(message);
  99. }
  100.  
  101. public static ServerMessage deserialize(String xml) throws IOException {
  102. XmlMapper xmlMapper = new XmlMapper();
  103. xmlMapper.registerSubtypes(LoginResponse.class, NewMessage.class);
  104. xmlMapper.enable(DeserializationFeature.ACCEPT_EMPTY_STRING_AS_NULL_OBJECT);
  105. return xmlMapper.readValue(xml, ServerMessage.class);
  106. }
  107. }
  108.  
  109. class ServerMessageSerializerModifier extends BeanSerializerModifier {
  110. @Override
  111. public JsonSerializer<?> modifySerializer(
  112. SerializationConfig config, BeanDescription beanDesc, JsonSerializer<?> serializer) {
  113. if (ServerMessage.class.isAssignableFrom(beanDesc.getBeanClass())) {
  114. return new ServerMessageSerializer((JsonSerializer<Object>) serializer);
  115. }
  116. return serializer;
  117. }
  118. }
  119.  
  120. class ServerMessageSerializer extends JsonSerializer<Object> {
  121. private final JsonSerializer<Object> defaultSerializer;
  122.  
  123. ServerMessageSerializer(JsonSerializer<Object> defaultSerializer) {
  124. this.defaultSerializer = defaultSerializer;
  125. }
  126.  
  127. @Override
  128. public void serialize(Object value, JsonGenerator gen, SerializerProvider serializers) throws IOException {
  129. if (value instanceof ServerMessage serverMessage) {
  130. gen.writeStartObject();
  131. gen.writeObjectField("errorType", serverMessage.getErrorType());
  132. gen.writeFieldName(gen.getOutputContext().getCurrentName()); // Write the field name
  133. gen.writeStartObject(); // Start the object for the current field
  134. defaultSerializer.unwrappingSerializer(null).serialize(value, gen, serializers);
  135. gen.writeEndObject(); // End the object for the current field
  136. gen.writeEndObject();
  137. } else {
  138. defaultSerializer.serialize(value, gen, serializers);
  139. }
  140. }
  141.  
  142. @Override
  143. public void serializeWithType(
  144. Object value, JsonGenerator gen, SerializerProvider serializers, TypeSerializer typeSer) throws IOException {
  145. // Include type id handling
  146. WritableTypeId typeId = typeSer.typeId(value, JsonToken.START_OBJECT);
  147. typeSer.writeTypePrefix(gen, typeId);
  148. serialize(value, gen, serializers);
  149. typeSer.writeTypeSuffix(gen, typeId);
  150. }
  151. }
  152.  
  153.  
  154.  
  155. Exception in thread "main" com.fasterxml.jackson.core.JsonGenerationException: Can not start an object, expecting field name
  156. at com.fasterxml.jackson.core.JsonGenerator._reportError(JsonGenerator.java:2849)
  157. at com.fasterxml.jackson.dataformat.xml.ser.ToXmlGenerator._verifyValueWrite(ToXmlGenerator.java:1297)
  158. at com.fasterxml.jackson.dataformat.xml.ser.ToXmlGenerator.writeStartObject(ToXmlGenerator.java:563)
  159. at org.example.ServerMessageSerializer.serialize(Main.java:129)
  160. at org.example.ServerMessageSerializer.serializeWithType(Main.java:147)
  161. at com.fasterxml.jackson.databind.ser.impl.TypeWrappedSerializer.serialize(TypeWrappedSerializer.java:32)
  162. at com.fasterxml.jackson.dataformat.xml.ser.XmlSerializerProvider.serializeValue(XmlSerializerProvider.java:108)
  163. at com.fasterxml.jackson.databind.ObjectMapper._writeValueAndClose(ObjectMapper.java:4719)
  164. at com.fasterxml.jackson.databind.ObjectMapper.writeValueAsString(ObjectMapper.java:3964)
  165. at org.example.Main.main(Main.java:25)
Advertisement
Add Comment
Please, Sign In to add comment