MCPcopy Create free account
hub / github.com/apache/fory / detectSerializer

Method detectSerializer

javascript/packages/core/lib/gen/any.ts:30–111  ·  view source on GitHub ↗
(readContext: ReadContext)

Source from the content-addressed store, hash-verified

28
29export class AnyHelper {
30 static detectSerializer(readContext: ReadContext) {
31 const reader = readContext.reader;
32 const typeResolver = readContext.typeResolver;
33 const typeId = reader.readUint8();
34 let userTypeId = -1;
35 if (TypeId.needsUserTypeId(typeId) && typeId !== TypeId.COMPATIBLE_STRUCT) {
36 userTypeId = reader.readVarUint32Small7();
37 }
38 let serializer: Serializer | undefined;
39
40 function buildNamedTypeKey(ns: string, typeName: string) {
41 return `${ns}$${typeName}`;
42 }
43
44 function tryUpdateSerializer(serializer: Serializer | undefined | null, typeMeta: TypeMeta) {
45 if (!serializer) {
46 return readContext.genSerializerByTypeMetaRuntime(typeMeta);
47 }
48 const hash = serializer.getHash();
49 if (hash !== typeMeta.getHash()) {
50 return readContext.genSerializerByTypeMetaRuntime(typeMeta, serializer);
51 }
52 return serializer;
53 }
54
55 switch (typeId) {
56 case TypeId.COMPATIBLE_STRUCT:
57 {
58 const typeMeta = readContext.readTypeMeta();
59 serializer = typeResolver.getSerializerById(typeId, typeMeta.getUserTypeId());
60 serializer = tryUpdateSerializer(serializer, typeMeta);
61 }
62 break;
63 case TypeId.NAMED_ENUM:
64 case TypeId.NAMED_UNION:
65 if (readContext.isCompatible()) {
66 const typeMeta = readContext.readTypeMeta();
67 const ns = typeMeta.getNs();
68 const typeName = typeMeta.getTypeName();
69 serializer = typeResolver.getSerializerByName(buildNamedTypeKey(ns, typeName));
70 } else {
71 const ns = readContext.readNamespace();
72 const typeName = readContext.readTypeName();
73 serializer = typeResolver.getSerializerByName(buildNamedTypeKey(ns, typeName));
74 }
75 break;
76 case TypeId.NAMED_EXT:
77 if (readContext.isCompatible()) {
78 const typeMeta = readContext.readTypeMeta();
79 const ns = typeMeta.getNs();
80 const typeName = typeMeta.getTypeName();
81 serializer = typeResolver.getSerializerByName(buildNamedTypeKey(ns, typeName));
82 } else {
83 const ns = readContext.readNamespace();
84 const typeName = readContext.readTypeName();
85 serializer = typeResolver.getSerializerByName(buildNamedTypeKey(ns, typeName));
86 }
87 break;

Callers 5

resolveRootSerializerFunction · 0.80
readMethod · 0.80
readElementMethod · 0.80
readMethod · 0.80
detectAnySerializerFunction · 0.80

Calls 12

needsUserTypeIdMethod · 0.80
getNsMethod · 0.80
readUint8Method · 0.45
readVarUint32Small7Method · 0.45
readTypeMetaMethod · 0.45
getSerializerByIdMethod · 0.45
getUserTypeIdMethod · 0.45
isCompatibleMethod · 0.45
getTypeNameMethod · 0.45
getSerializerByNameMethod · 0.45
readNamespaceMethod · 0.45
readTypeNameMethod · 0.45

Tested by 1

detectAnySerializerFunction · 0.64