Skip to content

Commit 716da79

Browse files
committed
fix: preserve serializer class names in production
1 parent 308a117 commit 716da79

2 files changed

Lines changed: 46 additions & 7 deletions

File tree

packages/serializer/src/index.ts

Lines changed: 10 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,16 @@
11
import "reflect-metadata";
22

3-
let getOriginalNameOf: (class_: { [x: string | number | symbol]: any; new (...args: any[]): any }) => string = (
4-
class_,
5-
) => class_.name;
3+
type SerializableClass = {
4+
className?: string;
5+
name: string;
6+
new (...args: any[]): any;
7+
};
8+
9+
let getOriginalNameOf: (class_: SerializableClass) => string = (class_) => class_.className ?? class_.name;
610
export function configureSerializer(
7-
getOriginalNameOfFn: (class_: { [x: string | number | symbol]: any; new (...args: any[]): any }) => string,
11+
getOriginalNameOfFn: (class_: SerializableClass) => string,
812
) {
9-
getOriginalNameOf = getOriginalNameOfFn;
13+
getOriginalNameOf = (class_) => (class_.className === undefined ? class_.name : getOriginalNameOfFn(class_));
1014
}
1115

1216
/**
@@ -124,7 +128,7 @@ export function deserialize(originalJson: any, extra?: any): any {
124128
const className = json._;
125129
const class_ = classes.get(className);
126130
if (!class_) {
127-
throw TypeError(`[Serializer] Cannot find class ${class_} of ${JSON.stringify(json)}`);
131+
throw TypeError(`[Serializer] Cannot find class ${className} of ${JSON.stringify(json)}`);
128132
}
129133
// 先把json中有_的值反序列化
130134
for (const key in json) {

packages/serializer/tests/index.test.ts

Lines changed: 36 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import { describe, expect, test } from "vitest";
2-
import { deserialize, serializable, serialize } from "../src";
2+
import { configureSerializer, deserialize, serializable, serialize } from "../src";
33

44
describe("对象序列化", () => {
55
class A {
@@ -69,6 +69,41 @@ describe("对象序列化", () => {
6969
expect(deserialized.nestedInstance).toBeInstanceOf(A);
7070
expect(deserialized.propString).toBe("@graphif/serializer");
7171
});
72+
73+
test("使用稳定类名而不是压缩后的运行时类名", () => {
74+
class a {
75+
static className = "StableClass";
76+
77+
@serializable
78+
value: string;
79+
80+
constructor(value: string) {
81+
this.value = value;
82+
}
83+
}
84+
85+
const serialized = serialize(new a("value"));
86+
expect(serialized).toEqual({ _: "StableClass", value: "value" });
87+
expect(deserialize(serialized)).toBeInstanceOf(a);
88+
});
89+
90+
test("配置的类名解析器会回退到运行时类名", () => {
91+
configureSerializer((class_) => class_.className!);
92+
93+
class C {
94+
@serializable
95+
value: string;
96+
97+
constructor(value: string) {
98+
this.value = value;
99+
}
100+
}
101+
102+
const serialized = serialize(new C("value"));
103+
expect(serialized).toEqual({ _: "C", value: "value" });
104+
expect(deserialize(serialized)).toBeInstanceOf(C);
105+
});
106+
72107
// 指针引用同一性的反序列化测试(数组与对象容器)
73108
class B {
74109
@serializable

0 commit comments

Comments
 (0)