java
package hc.ghupasselongo.java.test01.helpers;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.util.Base64;
public class Serializer {
public static String serialize(Object object) {
try {
ByteArrayOutputStream baos = new ByteArrayOutputStream();
ObjectOutputStream oos = new ObjectOutputStream(baos);
oos.writeObject(object);
return Base64.getEncoder().encodeToString(baos.toByteArray());
} catch (Exception errException) {
System.out.println(errException);
return null;
}
}
public static Object unserialize(String encodedObject) {
try {
byte[] serializedObject = Base64.getDecoder().decode(encodedObject);
ByteArrayInputStream bais = new ByteArrayInputStream(serializedObject);
ObjectInputStream ois = new ObjectInputStream(bais);
return ois.readObject(); // <- desserializaΓ§Γ£o the fato
} catch (Exception errorException) {
System.err.println(errorException);
return null;
}
}
}
package hc.ghupasselongo.java.test01.entities;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.Serializable;
import lombok.Getter;
import lombok.Setter;
@Getter
@Setter
public class User implements Serializable {
private String name;
private String role;
private Integer id;
@Override // sobrescrita da funΓ§Γ£o que ja existe no core do java
public String toString() {
System.out.println("[*] toString() called!");
return super.toString();
}
@Override
public int hashCode() {
System.err.println("[*] hashCode() called!");
return super.hashCode();
}
@Override
public boolean equals(Object object) {
System.err.println("[*] equals() called!");
return super.equals(object);
}
private void readObject(ObjectInputStream ois) throws IOException, ClassNotFoundException {
System.out.println("[*] readObject() called!"); // comportamento similar Γ __wakeup()
System.out.println(this.name); // retorna null
ois.defaultReadObject(); // leitura das propriedades do objeto serializado
System.err.println(this.id); // retorna o id
}
}
package hc.ghupasselongo.java.test01.controllers;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.Set;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import hc.ghupasselongo.java.test01.dto.ExampleDTO;
import hc.ghupasselongo.java.test01.entities.User;
import hc.ghupasselongo.java.test01.helpers.Serializer;
import jakarta.validation.Valid;
@RestController
@RequestMapping("/")
public class HomeController {
@GetMapping
public String test() {
User user0 = new User();
user0.setId(888);
user0.setName("0xf");
user0.setRole("dev");
User user1 = new User();
user1.setId(777);
user1.setName("ghu");
user1.setRole("admin");
ArrayList<User> userArray = new ArrayList<>();
userArray.add(user0);
userArray.add(user1);
userArray.contains(user1); // implicitamente chama a funΓ§Γ£o equals
System.err.print(user0); // pra triggar a toString()
Set<User> userList = new HashSet<>();
userList.add(user1); // pra triggar a hashSet()
System.out.println(user1.equals(user0)); // pra triggar a equals
return Serializer.serialize(user1);
}
@PostMapping
public String test(@Valid @RequestBody ExampleDTO exampleDTO) {
String object = exampleDTO.getPayload(); // {"payload":<objeto serializado aq>}
User user = (User)Serializer.unserialize(object); // objeto da classe User
return user.getName(); // chama a getName desse objeto
}
}
package hc.ghupasselongo.java.test01.dto;
import jakarta.validation.constraints.NotBlank;
import lombok.Getter;
import lombok.Setter;
@Getter
@Setter
public class ExampleDTO {
@NotBlank
private String payload;
}
// uma dto serve para definir a tipagem e a obrigatoriedade de dados.