Prechádzať zdrojové kódy

rename TypedSettings to TypedMessage

Darien Raymond 9 rokov pred
rodič
commit
50bc195f7f
52 zmenil súbory, kde vykonal 451 pridanie a 461 odobranie
  1. 2 2
      app/dns/server.go
  2. 2 2
      app/router/router.go
  3. 24 24
      app/web/config.pb.go
  4. 2 2
      app/web/config.proto
  5. 0 50
      common/loader/type.go
  6. 0 62
      common/loader/type.pb.go
  7. 0 14
      common/loader/type.proto
  8. 17 17
      common/protocol/user.pb.go
  9. 2 2
      common/protocol/user.proto
  10. 42 0
      common/serial/typed_message.go
  11. 62 0
      common/serial/typed_message.pb.go
  12. 14 0
      common/serial/typed_message.proto
  13. 55 54
      config.pb.go
  14. 4 4
      config.proto
  15. 13 13
      proxy/blackhole/config.pb.go
  16. 2 2
      proxy/blackhole/config.proto
  17. 2 2
      proxy/blackhole/init.go
  18. 2 2
      proxy/dokodemo/dokodemo.go
  19. 2 2
      proxy/freedom/freedom.go
  20. 2 2
      proxy/http/server.go
  21. 3 3
      proxy/shadowsocks/init.go
  22. 3 4
      proxy/shadowsocks/protocol_test.go
  23. 2 2
      proxy/socks/server.go
  24. 2 2
      proxy/vmess/encoding/encoding_test.go
  25. 3 3
      proxy/vmess/inbound/inbound.go
  26. 2 2
      proxy/vmess/outbound/command.go
  27. 2 2
      proxy/vmess/outbound/outbound.go
  28. 7 7
      tools/conf/blackhole.go
  29. 2 2
      tools/conf/builable.go
  30. 3 3
      tools/conf/dokodemo.go
  31. 3 3
      tools/conf/freedom.go
  32. 3 3
      tools/conf/http.go
  33. 7 7
      tools/conf/shadowsocks.go
  34. 6 6
      tools/conf/socks.go
  35. 11 11
      tools/conf/transport_authenticators.go
  36. 9 9
      tools/conf/transport_internet.go
  37. 3 3
      tools/conf/v2ray.go
  38. 6 7
      tools/conf/vmess.go
  39. 2 2
      transport/internet/config.go
  40. 28 27
      transport/internet/config.pb.go
  41. 3 3
      transport/internet/config.proto
  42. 4 4
      transport/internet/header_test.go
  43. 1 2
      transport/internet/headers/http/http.go
  44. 3 3
      transport/internet/headers/noop/noop.go
  45. 1 2
      transport/internet/headers/srtp/srtp.go
  46. 1 2
      transport/internet/headers/utp/utp.go
  47. 42 42
      transport/internet/kcp/config.pb.go
  48. 2 2
      transport/internet/kcp/config.proto
  49. 3 3
      transport/internet/kcp/kcp_test.go
  50. 22 21
      transport/internet/tcp/config.pb.go
  51. 2 2
      transport/internet/tcp/config.proto
  52. 11 11
      transport/internet/ws/ws_test.go

+ 2 - 2
app/dns/server.go

@@ -8,9 +8,9 @@ import (
 	"v2ray.com/core/app"
 	"v2ray.com/core/app/dispatcher"
 	"v2ray.com/core/common/errors"
-	"v2ray.com/core/common/loader"
 	"v2ray.com/core/common/log"
 	v2net "v2ray.com/core/common/net"
+	"v2ray.com/core/common/serial"
 
 	"github.com/miekg/dns"
 )
@@ -125,5 +125,5 @@ func (v CacheServerFactory) AppId() app.ID {
 }
 
 func init() {
-	app.RegisterApplicationFactory(loader.GetType(new(Config)), CacheServerFactory{})
+	app.RegisterApplicationFactory(serial.GetMessageType(new(Config)), CacheServerFactory{})
 }

+ 2 - 2
app/router/router.go

@@ -4,9 +4,9 @@ import (
 	"v2ray.com/core/app"
 	"v2ray.com/core/app/dns"
 	"v2ray.com/core/common/errors"
-	"v2ray.com/core/common/loader"
 	"v2ray.com/core/common/log"
 	v2net "v2ray.com/core/common/net"
+	"v2ray.com/core/common/serial"
 	"v2ray.com/core/proxy"
 )
 
@@ -125,5 +125,5 @@ func (RouterFactory) AppId() app.ID {
 }
 
 func init() {
-	app.RegisterApplicationFactory(loader.GetType(new(Config)), RouterFactory{})
+	app.RegisterApplicationFactory(serial.GetMessageType(new(Config)), RouterFactory{})
 }

+ 24 - 24
app/web/config.pb.go

@@ -18,7 +18,7 @@ package web
 import proto "github.com/golang/protobuf/proto"
 import fmt "fmt"
 import math "math"
-import v2ray_core_common_loader "v2ray.com/core/common/loader"
+import v2ray_core_common_serial "v2ray.com/core/common/serial"
 
 // Reference imports to suppress errors if they are not otherwise used.
 var _ = proto.Marshal
@@ -162,8 +162,8 @@ func _FileServer_Entry_OneofSizer(msg proto.Message) (n int) {
 }
 
 type Server struct {
-	Domain   []string                                `protobuf:"bytes,1,rep,name=domain" json:"domain,omitempty"`
-	Settings *v2ray_core_common_loader.TypedSettings `protobuf:"bytes,2,opt,name=settings" json:"settings,omitempty"`
+	Domain   []string                               `protobuf:"bytes,1,rep,name=domain" json:"domain,omitempty"`
+	Settings *v2ray_core_common_serial.TypedMessage `protobuf:"bytes,2,opt,name=settings" json:"settings,omitempty"`
 }
 
 func (m *Server) Reset()                    { *m = Server{} }
@@ -171,7 +171,7 @@ func (m *Server) String() string            { return proto.CompactTextString(m)
 func (*Server) ProtoMessage()               {}
 func (*Server) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{1} }
 
-func (m *Server) GetSettings() *v2ray_core_common_loader.TypedSettings {
+func (m *Server) GetSettings() *v2ray_core_common_serial.TypedMessage {
 	if m != nil {
 		return m.Settings
 	}
@@ -204,25 +204,25 @@ func init() {
 func init() { proto.RegisterFile("v2ray.com/core/app/web/config.proto", fileDescriptor0) }
 
 var fileDescriptor0 = []byte{
-	// 305 bytes of a gzipped FileDescriptorProto
+	// 312 bytes of a gzipped FileDescriptorProto
 	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x09, 0x6e, 0x88, 0x02, 0xff, 0x6c, 0x91, 0xc1, 0x4b, 0xc3, 0x30,
-	0x14, 0xc6, 0xad, 0xdb, 0x8a, 0x7d, 0xbd, 0x05, 0x19, 0x65, 0x07, 0x19, 0x53, 0xd8, 0xf0, 0x90,
-	0x42, 0xbd, 0x89, 0xa7, 0x6d, 0x8a, 0x37, 0xa5, 0xf3, 0xe4, 0x41, 0x68, 0xb3, 0xe7, 0x0c, 0xac,
-	0x4d, 0x78, 0x0b, 0x2b, 0xfd, 0x8f, 0xfc, 0x33, 0xa5, 0x49, 0x74, 0xa2, 0xbb, 0xe5, 0xe5, 0xfd,
-	0xbe, 0xf7, 0xbe, 0x7c, 0x81, 0xcb, 0x7d, 0x46, 0x45, 0xcb, 0x85, 0xaa, 0x52, 0xa1, 0x08, 0xd3,
-	0x42, 0xeb, 0xb4, 0xc1, 0x32, 0x15, 0xaa, 0x7e, 0x97, 0x1b, 0xae, 0x49, 0x19, 0xc5, 0xd8, 0x37,
-	0x44, 0xc8, 0x0b, 0xad, 0x79, 0x83, 0xe5, 0x68, 0xfa, 0x47, 0x28, 0x54, 0x55, 0xa9, 0x3a, 0xdd,
-	0xaa, 0x62, 0x8d, 0x94, 0x9a, 0x56, 0xa3, 0x13, 0x4f, 0x3e, 0x03, 0x80, 0x07, 0xb9, 0xc5, 0x15,
-	0xd2, 0x1e, 0x89, 0xdd, 0xc2, 0x00, 0x6b, 0x43, 0x6d, 0x12, 0x8c, 0x7b, 0xb3, 0x38, 0xbb, 0xe2,
-	0xff, 0x67, 0xf3, 0x03, 0xce, 0xef, 0x3b, 0x36, 0x77, 0x92, 0xd1, 0x1b, 0x0c, 0x6c, 0xcd, 0xce,
-	0xa1, 0xdf, 0x31, 0x49, 0x30, 0x0e, 0x66, 0xd1, 0xe3, 0x49, 0x6e, 0x2b, 0x76, 0x01, 0xd1, 0x52,
-	0x12, 0x0a, 0xa3, 0xa8, 0x4d, 0x4e, 0x7d, 0xeb, 0x70, 0xc5, 0x18, 0xf4, 0x75, 0x61, 0x3e, 0x92,
-	0x5e, 0xd7, 0xca, 0xed, 0x79, 0x1e, 0x43, 0xd4, 0x69, 0x9f, 0x68, 0x29, 0x69, 0x82, 0x10, 0x7a,
-	0x97, 0x43, 0x08, 0xd7, 0xaa, 0x2a, 0x64, 0x6d, 0x6d, 0x46, 0xb9, 0xaf, 0xd8, 0x02, 0xce, 0x76,
-	0x68, 0x8c, 0xac, 0x37, 0x3b, 0xbb, 0x21, 0xce, 0xa6, 0xbf, 0x1f, 0xe0, 0x42, 0xe0, 0x2e, 0x04,
-	0xfe, 0xd2, 0x6a, 0x5c, 0xaf, 0x3c, 0x9e, 0xff, 0x08, 0x27, 0x77, 0x10, 0x2e, 0x6c, 0xbc, 0x2c,
-	0x83, 0x70, 0x67, 0x17, 0xfa, 0x34, 0x46, 0xc7, 0xd2, 0x70, 0x96, 0x72, 0x4f, 0xce, 0xaf, 0x61,
-	0x28, 0x54, 0x75, 0x04, 0x9c, 0xc7, 0x6e, 0xea, 0x73, 0x17, 0xfb, 0x6b, 0xaf, 0xc1, 0xb2, 0x0c,
-	0xed, 0x17, 0xdc, 0x7c, 0x05, 0x00, 0x00, 0xff, 0xff, 0x27, 0xdc, 0x68, 0xd1, 0xe6, 0x01, 0x00,
-	0x00,
+	0x14, 0xc6, 0xad, 0xdb, 0x8a, 0x7d, 0xbd, 0x05, 0x19, 0x65, 0x07, 0x19, 0x53, 0x64, 0x78, 0x48,
+	0xa5, 0xde, 0xc4, 0x53, 0x9d, 0xe2, 0x45, 0x94, 0xea, 0xc9, 0x83, 0x92, 0x76, 0xcf, 0x19, 0x58,
+	0x9b, 0xf0, 0x1a, 0x56, 0xfa, 0x1f, 0xf9, 0x67, 0x4a, 0x93, 0xea, 0x44, 0x77, 0xcb, 0xcb, 0xfb,
+	0xbe, 0xf7, 0xbe, 0xfc, 0x02, 0xc7, 0x9b, 0x84, 0x44, 0xcb, 0x0b, 0x55, 0xc6, 0x85, 0x22, 0x8c,
+	0x85, 0xd6, 0x71, 0x83, 0x79, 0x5c, 0xa8, 0xea, 0x5d, 0xae, 0xb8, 0x26, 0x65, 0x14, 0x63, 0xdf,
+	0x22, 0x42, 0x2e, 0xb4, 0xe6, 0x0d, 0xe6, 0x93, 0xf3, 0x3f, 0xc6, 0x42, 0x95, 0xa5, 0xaa, 0xe2,
+	0x1a, 0x49, 0x8a, 0x75, 0x6c, 0x5a, 0x8d, 0xcb, 0xb7, 0x12, 0xeb, 0x5a, 0xac, 0xd0, 0x4d, 0x99,
+	0x7d, 0x7a, 0x00, 0xb7, 0x72, 0x8d, 0x4f, 0x48, 0x1b, 0x24, 0x76, 0x09, 0x23, 0xac, 0x0c, 0xb5,
+	0x91, 0x37, 0x1d, 0xcc, 0xc3, 0xe4, 0x84, 0xff, 0x5f, 0xc2, 0xb7, 0x72, 0x7e, 0xd3, 0x69, 0x33,
+	0x67, 0x99, 0xbc, 0xc2, 0xc8, 0xd6, 0xec, 0x10, 0x86, 0x9d, 0x26, 0xf2, 0xa6, 0xde, 0x3c, 0xb8,
+	0xdb, 0xcb, 0x6c, 0xc5, 0x8e, 0x20, 0x58, 0x48, 0xc2, 0xc2, 0x28, 0x6a, 0xa3, 0xfd, 0xbe, 0xb5,
+	0xbd, 0x62, 0x0c, 0x86, 0x5a, 0x98, 0x8f, 0x68, 0xd0, 0xb5, 0x32, 0x7b, 0x4e, 0x43, 0x08, 0x3a,
+	0xef, 0x03, 0x2d, 0x24, 0xcd, 0x96, 0xe0, 0xf7, 0x29, 0xc7, 0xe0, 0x2f, 0x55, 0x29, 0x64, 0x65,
+	0x63, 0x06, 0x59, 0x5f, 0xb1, 0x14, 0x0e, 0x6a, 0x34, 0x46, 0x56, 0xab, 0xda, 0x6e, 0x08, 0x93,
+	0xd3, 0xdf, 0x0f, 0x70, 0x34, 0xb8, 0xa3, 0xc1, 0x9f, 0x3b, 0x1a, 0xf7, 0x0e, 0x46, 0xf6, 0xe3,
+	0x9b, 0x5d, 0x81, 0x7f, 0x6d, 0x31, 0xb3, 0x04, 0xfc, 0xda, 0xee, 0xeb, 0x61, 0x4c, 0x76, 0xc1,
+	0x70, 0x89, 0xb2, 0x5e, 0x99, 0x9e, 0xc1, 0xb8, 0x50, 0xe5, 0x0e, 0x61, 0x1a, 0xba, 0xa9, 0x8f,
+	0x1d, 0xf5, 0x97, 0x41, 0x83, 0x79, 0xee, 0xdb, 0x1f, 0xb8, 0xf8, 0x0a, 0x00, 0x00, 0xff, 0xff,
+	0x21, 0xbf, 0x92, 0xe3, 0xee, 0x01, 0x00, 0x00,
 }

+ 2 - 2
app/web/config.proto

@@ -5,7 +5,7 @@ option go_package = "web";
 option java_package = "com.v2ray.core.app.web";
 option java_outer_classname = "ConfigProto";
 
-import "v2ray.com/core/common/loader/type.proto";
+import "v2ray.com/core/common/serial/typed_message.proto";
 
 message FileServer {
   message Entry {
@@ -21,7 +21,7 @@ message FileServer {
 
 message Server {
   repeated string domain = 1;
-  v2ray.core.common.loader.TypedSettings settings = 2;
+  v2ray.core.common.serial.TypedMessage settings = 2;
 }
 
 message Config {

+ 0 - 50
common/loader/type.go

@@ -1,50 +0,0 @@
-package loader
-
-import (
-	"reflect"
-
-	"github.com/golang/protobuf/proto"
-	"v2ray.com/core/common/errors"
-)
-
-func NewTypedSettings(message proto.Message) *TypedSettings {
-	if message == nil {
-		return nil
-	}
-	settings, _ := proto.Marshal(message)
-	return &TypedSettings{
-		Type:     GetType(message),
-		Settings: settings,
-	}
-}
-
-func GetType(message proto.Message) string {
-	return proto.MessageName(message)
-}
-
-func GetInstance(messageType string) (interface{}, error) {
-	mType := proto.MessageType(messageType).Elem()
-	if mType == nil {
-		return nil, errors.New("Unknown type: " + messageType)
-	}
-	return reflect.New(mType).Interface(), nil
-}
-
-func (v *TypedSettings) Load(message proto.Message) error {
-	targetType := GetType(message)
-	if targetType != v.Type {
-		return errors.New("Have type " + v.Type + ", but retrieved for " + targetType)
-	}
-	return proto.Unmarshal(v.Settings, message)
-}
-
-func (v *TypedSettings) GetInstance() (interface{}, error) {
-	instance, err := GetInstance(v.Type)
-	if err != nil {
-		return nil, err
-	}
-	if err := proto.Unmarshal(v.Settings, instance.(proto.Message)); err != nil {
-		return nil, err
-	}
-	return instance, nil
-}

+ 0 - 62
common/loader/type.pb.go

@@ -1,62 +0,0 @@
-// Code generated by protoc-gen-go.
-// source: v2ray.com/core/common/loader/type.proto
-// DO NOT EDIT!
-
-/*
-Package loader is a generated protocol buffer package.
-
-It is generated from these files:
-	v2ray.com/core/common/loader/type.proto
-
-It has these top-level messages:
-	TypedSettings
-*/
-package loader
-
-import proto "github.com/golang/protobuf/proto"
-import fmt "fmt"
-import math "math"
-
-// Reference imports to suppress errors if they are not otherwise used.
-var _ = proto.Marshal
-var _ = fmt.Errorf
-var _ = math.Inf
-
-// This is a compile-time assertion to ensure that this generated file
-// is compatible with the proto package it is being compiled against.
-// A compilation error at this line likely means your copy of the
-// proto package needs to be updated.
-const _ = proto.ProtoPackageIsVersion2 // please upgrade the proto package
-
-// Serialized proto message along with its type name.
-type TypedSettings struct {
-	// The name of the message type, retrieved from protobuf API.
-	Type string `protobuf:"bytes,1,opt,name=type" json:"type,omitempty"`
-	// Serialized proto message.
-	Settings []byte `protobuf:"bytes,2,opt,name=settings,proto3" json:"settings,omitempty"`
-}
-
-func (m *TypedSettings) Reset()                    { *m = TypedSettings{} }
-func (m *TypedSettings) String() string            { return proto.CompactTextString(m) }
-func (*TypedSettings) ProtoMessage()               {}
-func (*TypedSettings) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{0} }
-
-func init() {
-	proto.RegisterType((*TypedSettings)(nil), "v2ray.core.common.loader.TypedSettings")
-}
-
-func init() { proto.RegisterFile("v2ray.com/core/common/loader/type.proto", fileDescriptor0) }
-
-var fileDescriptor0 = []byte{
-	// 151 bytes of a gzipped FileDescriptorProto
-	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x09, 0x6e, 0x88, 0x02, 0xff, 0xe2, 0x52, 0x2f, 0x33, 0x2a, 0x4a,
-	0xac, 0xd4, 0x4b, 0xce, 0xcf, 0xd5, 0x4f, 0xce, 0x2f, 0x4a, 0xd5, 0x4f, 0xce, 0xcf, 0xcd, 0xcd,
-	0xcf, 0xd3, 0xcf, 0xc9, 0x4f, 0x4c, 0x49, 0x2d, 0xd2, 0x2f, 0xa9, 0x2c, 0x48, 0xd5, 0x2b, 0x28,
-	0xca, 0x2f, 0xc9, 0x17, 0x92, 0x80, 0x29, 0x2c, 0x4a, 0xd5, 0x83, 0x28, 0xd2, 0x83, 0x28, 0x52,
-	0xb2, 0xe7, 0xe2, 0x0d, 0xa9, 0x2c, 0x48, 0x4d, 0x09, 0x4e, 0x2d, 0x29, 0xc9, 0xcc, 0x4b, 0x2f,
-	0x16, 0x12, 0xe2, 0x62, 0x01, 0x69, 0x94, 0x60, 0x54, 0x60, 0xd4, 0xe0, 0x0c, 0x02, 0xb3, 0x85,
-	0xa4, 0xb8, 0x38, 0x8a, 0xa1, 0xf2, 0x12, 0x4c, 0x0a, 0x8c, 0x1a, 0x3c, 0x41, 0x70, 0xbe, 0x93,
-	0x21, 0x97, 0x4c, 0x72, 0x7e, 0xae, 0x1e, 0x2e, 0x0b, 0x9c, 0x38, 0x41, 0xc6, 0x07, 0x80, 0x5c,
-	0x11, 0xc5, 0x06, 0x11, 0x4a, 0x62, 0x03, 0x3b, 0xca, 0x18, 0x10, 0x00, 0x00, 0xff, 0xff, 0x24,
-	0xa2, 0x4d, 0x76, 0xbf, 0x00, 0x00, 0x00,
-}

+ 0 - 14
common/loader/type.proto

@@ -1,14 +0,0 @@
-syntax = "proto3";
-
-package v2ray.core.common.loader;
-option go_package = "loader";
-option java_package = "com.v2ray.core.common.loader";
-option java_outer_classname = "TypeProto";
-
-// Serialized proto message along with its type name.
-message TypedSettings {
-  // The name of the message type, retrieved from protobuf API.
-  string type = 1;
-  // Serialized proto message. 
-  bytes settings = 2;
-}

+ 17 - 17
common/protocol/user.pb.go

@@ -7,7 +7,7 @@ package protocol
 import proto "github.com/golang/protobuf/proto"
 import fmt "fmt"
 import math "math"
-import v2ray_core_common_loader "v2ray.com/core/common/loader"
+import v2ray_core_common_serial "v2ray.com/core/common/serial"
 
 // Reference imports to suppress errors if they are not otherwise used.
 var _ = proto.Marshal
@@ -18,7 +18,7 @@ type User struct {
 	Level uint32 `protobuf:"varint,1,opt,name=level" json:"level,omitempty"`
 	Email string `protobuf:"bytes,2,opt,name=email" json:"email,omitempty"`
 	// Protocol specific account information.
-	Account *v2ray_core_common_loader.TypedSettings `protobuf:"bytes,3,opt,name=account" json:"account,omitempty"`
+	Account *v2ray_core_common_serial.TypedMessage `protobuf:"bytes,3,opt,name=account" json:"account,omitempty"`
 }
 
 func (m *User) Reset()                    { *m = User{} }
@@ -26,7 +26,7 @@ func (m *User) String() string            { return proto.CompactTextString(m) }
 func (*User) ProtoMessage()               {}
 func (*User) Descriptor() ([]byte, []int) { return fileDescriptor2, []int{0} }
 
-func (m *User) GetAccount() *v2ray_core_common_loader.TypedSettings {
+func (m *User) GetAccount() *v2ray_core_common_serial.TypedMessage {
 	if m != nil {
 		return m.Account
 	}
@@ -40,18 +40,18 @@ func init() {
 func init() { proto.RegisterFile("v2ray.com/core/common/protocol/user.proto", fileDescriptor2) }
 
 var fileDescriptor2 = []byte{
-	// 200 bytes of a gzipped FileDescriptorProto
-	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x09, 0x6e, 0x88, 0x02, 0xff, 0x74, 0x8f, 0x3f, 0xef, 0x82, 0x30,
-	0x10, 0x86, 0xd3, 0xdf, 0x5f, 0xa9, 0x71, 0x21, 0x0e, 0x84, 0xc1, 0x10, 0x17, 0x70, 0x69, 0x13,
-	0x8c, 0x1f, 0x40, 0x3e, 0x81, 0x41, 0x5d, 0xdc, 0x6a, 0xb9, 0x18, 0x92, 0x96, 0x23, 0xa5, 0x90,
-	0xf0, 0xed, 0x0d, 0x34, 0x9d, 0xd4, 0xad, 0xcf, 0x9b, 0xa7, 0x77, 0xef, 0xd1, 0xdd, 0x90, 0x1b,
-	0x31, 0x32, 0x89, 0x9a, 0x4b, 0x34, 0xc0, 0x25, 0x6a, 0x8d, 0x0d, 0x6f, 0x0d, 0x5a, 0x94, 0xa8,
-	0x78, 0xdf, 0x81, 0x61, 0x33, 0x85, 0xb1, 0x57, 0x0d, 0x30, 0xa7, 0x31, 0xaf, 0xc5, 0xe9, 0xfb,
-	0x31, 0x0a, 0x45, 0x05, 0x86, 0xdb, 0xb1, 0x05, 0xe7, 0x6e, 0x7b, 0xfa, 0x73, 0xed, 0xc0, 0x84,
-	0x6b, 0xfa, 0xab, 0x60, 0x00, 0x15, 0x91, 0x84, 0x64, 0xab, 0xd2, 0xc1, 0x94, 0x82, 0x16, 0xb5,
-	0x8a, 0xbe, 0x12, 0x92, 0x05, 0xa5, 0x83, 0xf0, 0x48, 0xff, 0x85, 0x94, 0xd8, 0x37, 0x36, 0xfa,
-	0x4e, 0x48, 0xb6, 0xcc, 0x53, 0xf6, 0x5a, 0xc5, 0xad, 0x62, 0x97, 0xb1, 0x85, 0xea, 0x0c, 0xd6,
-	0xd6, 0xcd, 0xa3, 0x2b, 0xfd, 0xbf, 0xe2, 0x40, 0x37, 0x12, 0x35, 0xfb, 0x7c, 0x41, 0x11, 0x4c,
-	0xb5, 0x4e, 0x13, 0xdd, 0x16, 0x3e, 0xbc, 0xff, 0xcd, 0xaf, 0xfd, 0x33, 0x00, 0x00, 0xff, 0xff,
-	0x68, 0x83, 0xed, 0x6b, 0x26, 0x01, 0x00, 0x00,
+	// 204 bytes of a gzipped FileDescriptorProto
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x09, 0x6e, 0x88, 0x02, 0xff, 0xe2, 0xd2, 0x2c, 0x33, 0x2a, 0x4a,
+	0xac, 0xd4, 0x4b, 0xce, 0xcf, 0xd5, 0x4f, 0xce, 0x2f, 0x4a, 0xd5, 0x4f, 0xce, 0xcf, 0xcd, 0xcd,
+	0xcf, 0xd3, 0x2f, 0x28, 0xca, 0x2f, 0xc9, 0x4f, 0xce, 0xcf, 0xd1, 0x2f, 0x2d, 0x4e, 0x2d, 0xd2,
+	0x03, 0xf3, 0x84, 0xa4, 0x60, 0x4a, 0x8b, 0x52, 0xf5, 0x20, 0xca, 0xf4, 0x60, 0xca, 0xa4, 0x0c,
+	0xb0, 0x1b, 0x53, 0x9c, 0x5a, 0x94, 0x99, 0x98, 0xa3, 0x5f, 0x52, 0x59, 0x90, 0x9a, 0x12, 0x9f,
+	0x9b, 0x5a, 0x5c, 0x9c, 0x98, 0x9e, 0x0a, 0xd1, 0xa4, 0x54, 0xc2, 0xc5, 0x12, 0x5a, 0x9c, 0x5a,
+	0x24, 0x24, 0xc2, 0xc5, 0x9a, 0x93, 0x5a, 0x96, 0x9a, 0x23, 0xc1, 0xa8, 0xc0, 0xa8, 0xc1, 0x1b,
+	0x04, 0xe1, 0x80, 0x44, 0x53, 0x73, 0x13, 0x33, 0x73, 0x24, 0x98, 0x14, 0x18, 0x35, 0x38, 0x83,
+	0x20, 0x1c, 0x21, 0x07, 0x2e, 0xf6, 0xc4, 0xe4, 0xe4, 0xfc, 0xd2, 0xbc, 0x12, 0x09, 0x66, 0x05,
+	0x46, 0x0d, 0x6e, 0x23, 0x35, 0x3d, 0x4c, 0x37, 0x41, 0xec, 0xd4, 0x0b, 0x01, 0xd9, 0xe9, 0x0b,
+	0xb1, 0x32, 0x08, 0xa6, 0xcd, 0xc9, 0x94, 0x4b, 0x2e, 0x39, 0x3f, 0x57, 0x0f, 0xb7, 0x4f, 0x9c,
+	0x38, 0x41, 0xae, 0x0a, 0x00, 0xf1, 0xa2, 0x38, 0x60, 0x82, 0x49, 0x6c, 0x60, 0x96, 0x31, 0x20,
+	0x00, 0x00, 0xff, 0xff, 0x2e, 0x02, 0xab, 0x48, 0x2e, 0x01, 0x00, 0x00,
 }

+ 2 - 2
common/protocol/user.proto

@@ -5,12 +5,12 @@ option go_package = "protocol";
 option java_package = "com.v2ray.core.common.protocol";
 option java_outer_classname = "UserProto";
 
-import "v2ray.com/core/common/loader/type.proto";
+import "v2ray.com/core/common/serial/typed_message.proto";
 
 message User {
   uint32 level = 1;
   string email = 2;
 
   // Protocol specific account information.
-  v2ray.core.common.loader.TypedSettings account = 3;
+  v2ray.core.common.serial.TypedMessage account = 3;
 }

+ 42 - 0
common/serial/typed_message.go

@@ -0,0 +1,42 @@
+package serial
+
+import (
+	"errors"
+	"reflect"
+
+	"github.com/golang/protobuf/proto"
+)
+
+func ToTypedMessage(message proto.Message) *TypedMessage {
+	if message == nil {
+		return nil
+	}
+	settings, _ := proto.Marshal(message)
+	return &TypedMessage{
+		Type:  GetMessageType(message),
+		Value: settings,
+	}
+}
+
+func GetMessageType(message proto.Message) string {
+	return proto.MessageName(message)
+}
+
+func GetInstance(messageType string) (interface{}, error) {
+	mType := proto.MessageType(messageType).Elem()
+	if mType == nil {
+		return nil, errors.New("Unknown type: " + messageType)
+	}
+	return reflect.New(mType).Interface(), nil
+}
+
+func (v *TypedMessage) GetInstance() (interface{}, error) {
+	instance, err := GetInstance(v.Type)
+	if err != nil {
+		return nil, err
+	}
+	if err := proto.Unmarshal(v.Value, instance.(proto.Message)); err != nil {
+		return nil, err
+	}
+	return instance, nil
+}

+ 62 - 0
common/serial/typed_message.pb.go

@@ -0,0 +1,62 @@
+// Code generated by protoc-gen-go.
+// source: v2ray.com/core/common/serial/typed_message.proto
+// DO NOT EDIT!
+
+/*
+Package serial is a generated protocol buffer package.
+
+It is generated from these files:
+	v2ray.com/core/common/serial/typed_message.proto
+
+It has these top-level messages:
+	TypedMessage
+*/
+package serial
+
+import proto "github.com/golang/protobuf/proto"
+import fmt "fmt"
+import math "math"
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ = proto.Marshal
+var _ = fmt.Errorf
+var _ = math.Inf
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the proto package it is being compiled against.
+// A compilation error at this line likely means your copy of the
+// proto package needs to be updated.
+const _ = proto.ProtoPackageIsVersion2 // please upgrade the proto package
+
+// Serialized proto message along with its type name.
+type TypedMessage struct {
+	// The name of the message type, retrieved from protobuf API.
+	Type string `protobuf:"bytes,1,opt,name=type" json:"type,omitempty"`
+	// Serialized proto message.
+	Value []byte `protobuf:"bytes,2,opt,name=value,proto3" json:"value,omitempty"`
+}
+
+func (m *TypedMessage) Reset()                    { *m = TypedMessage{} }
+func (m *TypedMessage) String() string            { return proto.CompactTextString(m) }
+func (*TypedMessage) ProtoMessage()               {}
+func (*TypedMessage) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{0} }
+
+func init() {
+	proto.RegisterType((*TypedMessage)(nil), "v2ray.core.common.serial.TypedMessage")
+}
+
+func init() { proto.RegisterFile("v2ray.com/core/common/serial/typed_message.proto", fileDescriptor0) }
+
+var fileDescriptor0 = []byte{
+	// 156 bytes of a gzipped FileDescriptorProto
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x09, 0x6e, 0x88, 0x02, 0xff, 0xe2, 0x32, 0x28, 0x33, 0x2a, 0x4a,
+	0xac, 0xd4, 0x4b, 0xce, 0xcf, 0xd5, 0x4f, 0xce, 0x2f, 0x4a, 0xd5, 0x4f, 0xce, 0xcf, 0xcd, 0xcd,
+	0xcf, 0xd3, 0x2f, 0x4e, 0x2d, 0xca, 0x4c, 0xcc, 0xd1, 0x2f, 0xa9, 0x2c, 0x48, 0x4d, 0x89, 0xcf,
+	0x4d, 0x2d, 0x2e, 0x4e, 0x4c, 0x4f, 0xd5, 0x2b, 0x28, 0xca, 0x2f, 0xc9, 0x17, 0x92, 0x80, 0xe9,
+	0x28, 0x4a, 0xd5, 0x83, 0xa8, 0xd6, 0x83, 0xa8, 0x56, 0xb2, 0xe0, 0xe2, 0x09, 0x01, 0x69, 0xf0,
+	0x85, 0xa8, 0x17, 0x12, 0xe2, 0x62, 0x01, 0x19, 0x20, 0xc1, 0xa8, 0xc0, 0xa8, 0xc1, 0x19, 0x04,
+	0x66, 0x0b, 0x89, 0x70, 0xb1, 0x96, 0x25, 0xe6, 0x94, 0xa6, 0x4a, 0x30, 0x29, 0x30, 0x6a, 0xf0,
+	0x04, 0x41, 0x38, 0x4e, 0x96, 0x5c, 0x32, 0xc9, 0xf9, 0xb9, 0x7a, 0xb8, 0x4c, 0x76, 0x12, 0x44,
+	0x36, 0x37, 0x00, 0xe4, 0x8c, 0x28, 0x36, 0x88, 0x54, 0x12, 0x1b, 0xd8, 0x55, 0xc6, 0x80, 0x00,
+	0x00, 0x00, 0xff, 0xff, 0xb5, 0x17, 0x99, 0x4c, 0xc9, 0x00, 0x00, 0x00,
+}

+ 14 - 0
common/serial/typed_message.proto

@@ -0,0 +1,14 @@
+syntax = "proto3";
+
+package v2ray.core.common.serial;
+option go_package = "serial";
+option java_package = "com.v2ray.core.common.serial";
+option java_outer_classname = "TypedMessageProto";
+
+// Serialized proto message along with its type name.
+message TypedMessage {
+  // The name of the message type, retrieved from protobuf API.
+  string type = 1;
+  // Serialized proto message. 
+  bytes value = 2;
+}

+ 55 - 54
config.pb.go

@@ -21,7 +21,7 @@ package core
 import proto "github.com/golang/protobuf/proto"
 import fmt "fmt"
 import math "math"
-import v2ray_core_common_loader "v2ray.com/core/common/loader"
+import v2ray_core_common_serial "v2ray.com/core/common/serial"
 import v2ray_core_common_net "v2ray.com/core/common/net"
 import v2ray_core_common_net1 "v2ray.com/core/common/net"
 import v2ray_core_common_log "v2ray.com/core/common/log"
@@ -138,7 +138,7 @@ func (m *AllocationStrategy) GetRefresh() *AllocationStrategyRefresh {
 // Config for an inbound connection handler.
 type InboundConnectionConfig struct {
 	// Protocol specific settings. Must be one of the supported protocols.
-	Settings *v2ray_core_common_loader.TypedSettings `protobuf:"bytes,1,opt,name=settings" json:"settings,omitempty"`
+	Settings *v2ray_core_common_serial.TypedMessage `protobuf:"bytes,1,opt,name=settings" json:"settings,omitempty"`
 	// Range of port number to run on. Both inclusive.
 	PortRange *v2ray_core_common_net.PortRange `protobuf:"bytes,2,opt,name=port_range,json=portRange" json:"port_range,omitempty"`
 	// IP address to listen on. 0.0.0.0 if unset.
@@ -155,7 +155,7 @@ func (m *InboundConnectionConfig) String() string            { return proto.Comp
 func (*InboundConnectionConfig) ProtoMessage()               {}
 func (*InboundConnectionConfig) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{3} }
 
-func (m *InboundConnectionConfig) GetSettings() *v2ray_core_common_loader.TypedSettings {
+func (m *InboundConnectionConfig) GetSettings() *v2ray_core_common_serial.TypedMessage {
 	if m != nil {
 		return m.Settings
 	}
@@ -192,7 +192,7 @@ func (m *InboundConnectionConfig) GetStreamSettings() *v2ray_core_transport_inte
 
 // Config for an outbound connection handler.
 type OutboundConnectionConfig struct {
-	Settings *v2ray_core_common_loader.TypedSettings `protobuf:"bytes,1,opt,name=settings" json:"settings,omitempty"`
+	Settings *v2ray_core_common_serial.TypedMessage `protobuf:"bytes,1,opt,name=settings" json:"settings,omitempty"`
 	// IP address to send data through. 0.0.0.0 if unset.
 	SendThrough    *v2ray_core_common_net1.IPOrDomain          `protobuf:"bytes,2,opt,name=send_through,json=sendThrough" json:"send_through,omitempty"`
 	StreamSettings *v2ray_core_transport_internet.StreamConfig `protobuf:"bytes,3,opt,name=stream_settings,json=streamSettings" json:"stream_settings,omitempty"`
@@ -205,7 +205,7 @@ func (m *OutboundConnectionConfig) String() string            { return proto.Com
 func (*OutboundConnectionConfig) ProtoMessage()               {}
 func (*OutboundConnectionConfig) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{4} }
 
-func (m *OutboundConnectionConfig) GetSettings() *v2ray_core_common_loader.TypedSettings {
+func (m *OutboundConnectionConfig) GetSettings() *v2ray_core_common_serial.TypedMessage {
 	if m != nil {
 		return m.Settings
 	}
@@ -240,8 +240,8 @@ type Config struct {
 	Outbound []*OutboundConnectionConfig   `protobuf:"bytes,2,rep,name=outbound" json:"outbound,omitempty"`
 	Log      *v2ray_core_common_log.Config `protobuf:"bytes,3,opt,name=log" json:"log,omitempty"`
 	// App configuration. Must be one in the app directory.
-	App       []*v2ray_core_common_loader.TypedSettings `protobuf:"bytes,4,rep,name=app" json:"app,omitempty"`
-	Transport *v2ray_core_transport.Config              `protobuf:"bytes,5,opt,name=transport" json:"transport,omitempty"`
+	App       []*v2ray_core_common_serial.TypedMessage `protobuf:"bytes,4,rep,name=app" json:"app,omitempty"`
+	Transport *v2ray_core_transport.Config             `protobuf:"bytes,5,opt,name=transport" json:"transport,omitempty"`
 }
 
 func (m *Config) Reset()                    { *m = Config{} }
@@ -270,7 +270,7 @@ func (m *Config) GetLog() *v2ray_core_common_log.Config {
 	return nil
 }
 
-func (m *Config) GetApp() []*v2ray_core_common_loader.TypedSettings {
+func (m *Config) GetApp() []*v2ray_core_common_serial.TypedMessage {
 	if m != nil {
 		return m.App
 	}
@@ -298,50 +298,51 @@ func init() {
 func init() { proto.RegisterFile("v2ray.com/core/config.proto", fileDescriptor0) }
 
 var fileDescriptor0 = []byte{
-	// 719 bytes of a gzipped FileDescriptorProto
-	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x09, 0x6e, 0x88, 0x02, 0xff, 0xb4, 0x95, 0xdd, 0x6e, 0xd3, 0x30,
-	0x1c, 0xc5, 0x97, 0xb6, 0xeb, 0xda, 0x7f, 0xb7, 0x52, 0x19, 0x04, 0x61, 0x30, 0x54, 0xba, 0xaf,
-	0x32, 0x50, 0x2a, 0x8a, 0x10, 0x1f, 0x12, 0x8c, 0xad, 0x03, 0x69, 0x20, 0xd1, 0xe2, 0xee, 0x8a,
-	0x9b, 0xca, 0x4b, 0xbd, 0x2c, 0x52, 0x62, 0x47, 0x8e, 0xbb, 0xad, 0x8f, 0xc0, 0xe3, 0xf0, 0x2a,
-	0x3c, 0x01, 0x8f, 0x82, 0xec, 0xb8, 0x69, 0x47, 0xdb, 0x6d, 0x12, 0xe2, 0x2e, 0x8d, 0xcf, 0xef,
-	0xd8, 0x39, 0xc7, 0x76, 0xe1, 0xc1, 0x59, 0x53, 0x90, 0xa1, 0xe3, 0xf2, 0xb0, 0xe1, 0x72, 0x41,
-	0x1b, 0x2e, 0x67, 0x27, 0xbe, 0xe7, 0x44, 0x82, 0x4b, 0x8e, 0x60, 0x34, 0x28, 0xe8, 0xea, 0xf6,
-	0x94, 0x30, 0x0c, 0x39, 0x6b, 0x04, 0x9c, 0xf4, 0xa9, 0x68, 0xc8, 0x61, 0x44, 0x13, 0x68, 0x75,
-	0x63, 0xb6, 0x90, 0x51, 0xd9, 0x88, 0xb8, 0x90, 0x46, 0xb5, 0x3d, 0x5f, 0x45, 0xfa, 0x7d, 0x41,
-	0xe3, 0xd8, 0x08, 0xb7, 0xe6, 0xcd, 0xeb, 0x5d, 0x5a, 0xeb, 0xaa, 0xf3, 0x97, 0x4e, 0x0a, 0xc2,
-	0x62, 0x35, 0x61, 0xc3, 0x67, 0x92, 0x0a, 0x65, 0x7c, 0x49, 0xbf, 0x39, 0x57, 0x3f, 0x29, 0xab,
-	0xbd, 0x84, 0xb5, 0xbd, 0x20, 0xe0, 0x2e, 0x91, 0x3e, 0x67, 0x5d, 0x29, 0x88, 0xa4, 0xde, 0xb0,
-	0xc5, 0x99, 0x3b, 0x10, 0x82, 0x32, 0x77, 0x88, 0xee, 0xc0, 0xe2, 0x19, 0x09, 0x06, 0xd4, 0xb6,
-	0xaa, 0x56, 0x7d, 0x05, 0x27, 0x3f, 0x6a, 0xcf, 0xe1, 0xfe, 0x34, 0x86, 0xe9, 0x89, 0xa0, 0xf1,
-	0xe9, 0x1c, 0xe4, 0x47, 0x06, 0xd0, 0x34, 0x83, 0x5e, 0x41, 0x4e, 0x85, 0xab, 0xb5, 0xe5, 0xe6,
-	0xba, 0x33, 0xae, 0xc4, 0x99, 0x56, 0x3b, 0x47, 0xc3, 0x88, 0x62, 0x0d, 0xa0, 0x2f, 0x50, 0x72,
-	0xc7, 0xeb, 0xb4, 0x33, 0x55, 0xab, 0x5e, 0x6a, 0x3e, 0xb9, 0x9a, 0x9f, 0xf8, 0x30, 0x3c, 0x49,
-	0xa3, 0x5d, 0x58, 0x12, 0xc9, 0xea, 0xed, 0xac, 0x36, 0xda, 0xbc, 0xda, 0xc8, 0x7c, 0x2a, 0x1e,
-	0x51, 0xb5, 0x67, 0x90, 0x53, 0x6b, 0x43, 0x00, 0xf9, 0xbd, 0xe0, 0x9c, 0x0c, 0xe3, 0xca, 0x82,
-	0x7a, 0xc6, 0x84, 0xf5, 0x79, 0x58, 0xb1, 0xd0, 0x32, 0x14, 0x3e, 0x5e, 0xa8, 0x9e, 0x48, 0x50,
-	0xc9, 0xd4, 0x7e, 0x65, 0xe1, 0xde, 0x21, 0x3b, 0xe6, 0x03, 0xd6, 0x6f, 0x71, 0xc6, 0xa8, 0xab,
-	0xbc, 0x5b, 0xba, 0x17, 0xd4, 0x82, 0x42, 0x4c, 0xa5, 0xf4, 0x99, 0x17, 0xeb, 0x50, 0x4a, 0xcd,
-	0xed, 0xc9, 0xb5, 0x24, 0xfb, 0xc3, 0x49, 0xf6, 0xa5, 0xce, 0xa3, 0xdf, 0x35, 0x72, 0x9c, 0x82,
-	0x68, 0x17, 0x40, 0x75, 0xdd, 0x13, 0x84, 0x79, 0xd4, 0x64, 0x53, 0x9d, 0x61, 0xc3, 0xa8, 0x74,
-	0x3a, 0x5c, 0x48, 0xac, 0x74, 0xb8, 0x18, 0x8d, 0x1e, 0xd1, 0x7b, 0x28, 0x06, 0x7e, 0x2c, 0x29,
-	0xeb, 0x71, 0x66, 0x22, 0x79, 0x3c, 0x87, 0x3f, 0xec, 0xb4, 0xc5, 0x01, 0x0f, 0x89, 0xcf, 0x70,
-	0x21, 0x61, 0xda, 0x0c, 0x55, 0x20, 0x2b, 0x89, 0x67, 0xe7, 0xaa, 0x56, 0xbd, 0x88, 0xd5, 0x23,
-	0x6a, 0xc3, 0x6d, 0x92, 0xe6, 0xd8, 0x8b, 0x4d, 0x90, 0xf6, 0xa2, 0xf6, 0x7e, 0x74, 0x4d, 0xdc,
-	0x88, 0x4c, 0xef, 0x9c, 0x23, 0xb8, 0x15, 0x4b, 0x41, 0x49, 0xd8, 0x4b, 0xf3, 0xca, 0x6b, 0xb3,
-	0xa7, 0x93, 0x66, 0xe9, 0xbe, 0x77, 0x46, 0xe7, 0xc4, 0xe9, 0x6a, 0x2a, 0x89, 0x1b, 0x97, 0x13,
-	0x8f, 0x51, 0x86, 0xe8, 0x35, 0xd8, 0x6a, 0xae, 0xf3, 0x5e, 0x44, 0xe2, 0xd8, 0x3f, 0xa3, 0x3d,
-	0x37, 0x2d, 0xc8, 0x5e, 0xaa, 0x5a, 0xf5, 0x02, 0xbe, 0xab, 0xc7, 0x3b, 0xc9, 0xf0, 0xb8, 0xbe,
-	0xda, 0xef, 0x0c, 0xd8, 0xed, 0x81, 0xfc, 0x8f, 0xad, 0x1e, 0xc0, 0x72, 0x4c, 0x59, 0xbf, 0x27,
-	0x4f, 0x05, 0x1f, 0x78, 0xa7, 0xa6, 0xd7, 0x1b, 0xf4, 0x52, 0x52, 0xd8, 0x51, 0x42, 0xcd, 0xca,
-	0x2d, 0xfb, 0xef, 0xb9, 0x7d, 0x83, 0x72, 0x24, 0xf8, 0xc5, 0x70, 0x6c, 0x9a, 0x34, 0xbb, 0x73,
-	0x8d, 0x69, 0x47, 0x41, 0xc6, 0x73, 0x45, 0x3b, 0xa4, 0x96, 0x53, 0x7b, 0xa8, 0xf6, 0x33, 0x03,
-	0x79, 0x13, 0xe8, 0x3b, 0x58, 0xf2, 0x93, 0x13, 0x64, 0x5b, 0xd5, 0x6c, 0xbd, 0x74, 0xf9, 0xea,
-	0x98, 0x73, 0xb8, 0xf0, 0x88, 0x41, 0x1f, 0xa0, 0xc0, 0x4d, 0x57, 0x76, 0x46, 0xf3, 0x1b, 0x93,
-	0xfc, 0xbc, 0x1e, 0x71, 0x4a, 0xa1, 0x06, 0x64, 0x03, 0xee, 0x99, 0xe8, 0xd6, 0x66, 0x96, 0xe9,
-	0x39, 0x86, 0x52, 0x4a, 0xf4, 0x06, 0xb2, 0x24, 0x8a, 0xec, 0x9c, 0x9e, 0xed, 0xc6, 0xed, 0x2b,
-	0x06, 0xbd, 0x85, 0x62, 0x1a, 0x9d, 0xc9, 0xf5, 0xe1, 0xec, 0x5c, 0xcd, 0x84, 0x63, 0xf9, 0xce,
-	0x16, 0x2c, 0x27, 0x2f, 0x3f, 0x71, 0x11, 0x12, 0xa9, 0x6e, 0xa2, 0x8e, 0xba, 0xfa, 0x8f, 0x07,
-	0x27, 0x95, 0x05, 0x54, 0x80, 0xdc, 0xe7, 0x6e, 0xfb, 0x6b, 0xc5, 0xda, 0x5f, 0x87, 0xb2, 0xcb,
-	0xc3, 0x09, 0xd7, 0xfd, 0x52, 0xc2, 0x69, 0xf5, 0xf7, 0x9c, 0x7a, 0x75, 0x9c, 0xd7, 0xff, 0x1a,
-	0x2f, 0xfe, 0x04, 0x00, 0x00, 0xff, 0xff, 0xe4, 0x6f, 0x70, 0x9e, 0x57, 0x07, 0x00, 0x00,
+	// 733 bytes of a gzipped FileDescriptorProto
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x09, 0x6e, 0x88, 0x02, 0xff, 0xb4, 0x95, 0xed, 0x6e, 0xd3, 0x3a,
+	0x1c, 0xc6, 0x97, 0xb6, 0xeb, 0xda, 0x7f, 0xb7, 0x9e, 0xca, 0xe7, 0xe8, 0x9c, 0x9c, 0xc1, 0x50,
+	0xe9, 0x5e, 0x28, 0x03, 0xa5, 0x50, 0x84, 0x98, 0x90, 0x60, 0xec, 0x05, 0xa4, 0x81, 0xa0, 0x25,
+	0xdd, 0x27, 0xbe, 0x44, 0x5e, 0xea, 0x65, 0x91, 0x12, 0x3b, 0xb2, 0xdd, 0x6d, 0xbd, 0x04, 0xee,
+	0x86, 0x5b, 0xe1, 0x0a, 0xb8, 0x15, 0x64, 0x3b, 0x4d, 0x3b, 0xda, 0x6e, 0x93, 0x10, 0xdf, 0xd2,
+	0xe4, 0xf9, 0x3d, 0x76, 0x9e, 0xe7, 0x1f, 0x17, 0xee, 0x9c, 0xb7, 0x39, 0x1e, 0x3a, 0x3e, 0x8b,
+	0x5b, 0x3e, 0xe3, 0xa4, 0xe5, 0x33, 0x7a, 0x1a, 0x06, 0x4e, 0xc2, 0x99, 0x64, 0x08, 0x46, 0x0f,
+	0x39, 0x59, 0x7d, 0x32, 0x25, 0x8c, 0x63, 0x46, 0x5b, 0x82, 0xf0, 0x10, 0x47, 0x2d, 0x39, 0x4c,
+	0x48, 0xdf, 0x8b, 0x89, 0x10, 0x38, 0x20, 0x86, 0x5e, 0xdd, 0x98, 0x4d, 0x50, 0x22, 0x5b, 0x09,
+	0xe3, 0x32, 0x55, 0x3d, 0x98, 0xaf, 0xc2, 0xfd, 0x3e, 0x27, 0x42, 0xa4, 0xc2, 0xad, 0xd9, 0xc2,
+	0x88, 0x05, 0x57, 0x36, 0xbd, 0xea, 0xfc, 0xa2, 0x93, 0x1c, 0x53, 0xa1, 0x16, 0x6c, 0x85, 0x54,
+	0x12, 0xae, 0x8c, 0xaf, 0xe8, 0x37, 0xe7, 0xea, 0x27, 0x65, 0x8d, 0xe7, 0xb0, 0xb6, 0x17, 0x45,
+	0xcc, 0xc7, 0x32, 0x64, 0xb4, 0x27, 0x39, 0x96, 0x24, 0x18, 0x1e, 0x30, 0xea, 0x0f, 0x38, 0x27,
+	0xd4, 0x1f, 0xa2, 0x7f, 0x60, 0xf1, 0x1c, 0x47, 0x03, 0x62, 0x5b, 0x75, 0xab, 0xb9, 0xe2, 0x9a,
+	0x1f, 0x8d, 0xa7, 0xf0, 0xff, 0x34, 0xe6, 0x92, 0x53, 0x4e, 0xc4, 0xd9, 0x1c, 0xe4, 0x6b, 0x0e,
+	0xd0, 0x34, 0x83, 0x5e, 0x40, 0x41, 0xa5, 0xac, 0xb5, 0xd5, 0xf6, 0xba, 0x33, 0xee, 0xc6, 0x99,
+	0x56, 0x3b, 0xc7, 0xc3, 0x84, 0xb8, 0x1a, 0x40, 0x1f, 0xa0, 0xe2, 0x8f, 0xf7, 0x69, 0xe7, 0xea,
+	0x56, 0xb3, 0xd2, 0x7e, 0x78, 0x3d, 0x3f, 0xf1, 0x62, 0xee, 0x24, 0x8d, 0x76, 0x61, 0x89, 0x9b,
+	0xdd, 0xdb, 0x79, 0x6d, 0xb4, 0x79, 0xbd, 0x51, 0xfa, 0xaa, 0xee, 0x88, 0x6a, 0x3c, 0x86, 0x82,
+	0xda, 0x1b, 0x02, 0x28, 0xee, 0x45, 0x17, 0x78, 0x28, 0x6a, 0x0b, 0xea, 0xda, 0xc5, 0xb4, 0xcf,
+	0xe2, 0x9a, 0x85, 0x96, 0xa1, 0xf4, 0xf6, 0x52, 0xf5, 0x84, 0xa3, 0x5a, 0xae, 0xf1, 0x3d, 0x0f,
+	0xff, 0x1d, 0xd1, 0x13, 0x36, 0xa0, 0xfd, 0x03, 0x46, 0x29, 0xf1, 0x95, 0xf7, 0x81, 0xee, 0x05,
+	0xed, 0x43, 0x49, 0x10, 0x29, 0x43, 0x1a, 0x08, 0x1d, 0x4a, 0xa5, 0xbd, 0x35, 0xb9, 0x17, 0x33,
+	0x1f, 0x8e, 0x19, 0x50, 0x9d, 0x47, 0xff, 0xa3, 0x99, 0x4f, 0x37, 0xe3, 0xd0, 0x2e, 0x80, 0xaa,
+	0xda, 0xe3, 0x98, 0x06, 0x24, 0x8d, 0xa6, 0x3e, 0xc3, 0x85, 0x12, 0xe9, 0x74, 0x19, 0x97, 0xae,
+	0xd2, 0xb9, 0xe5, 0x64, 0x74, 0x89, 0x5e, 0x43, 0x39, 0x0a, 0x85, 0x24, 0xd4, 0x63, 0x34, 0x4d,
+	0xe4, 0xfe, 0x1c, 0xfe, 0xa8, 0xdb, 0xe1, 0x87, 0x2c, 0xc6, 0x21, 0x75, 0x4b, 0x86, 0xe9, 0x50,
+	0x54, 0x83, 0xbc, 0xc4, 0x81, 0x5d, 0xa8, 0x5b, 0xcd, 0xb2, 0xab, 0x2e, 0x51, 0x07, 0xfe, 0xc6,
+	0x59, 0x8c, 0x9e, 0x48, 0x73, 0xb4, 0x17, 0xb5, 0xf7, 0xbd, 0x1b, 0xd2, 0x46, 0x78, 0x7a, 0x70,
+	0x8e, 0xe1, 0x2f, 0x21, 0x39, 0xc1, 0xb1, 0x97, 0xc5, 0x55, 0xd4, 0x66, 0x8f, 0x26, 0xcd, 0xb2,
+	0xb1, 0x77, 0x46, 0x9f, 0x89, 0xd3, 0xd3, 0x94, 0x49, 0xdb, 0xad, 0x1a, 0x8f, 0xde, 0x28, 0xb9,
+	0x1d, 0xb0, 0xd5, 0x5a, 0x17, 0x5e, 0x82, 0x85, 0x08, 0xcf, 0x89, 0xe7, 0x67, 0xfd, 0xd8, 0x4b,
+	0x75, 0xab, 0x59, 0x72, 0xff, 0xd5, 0xcf, 0xbb, 0xe6, 0xf1, 0xb8, 0xbd, 0xc6, 0x8f, 0x1c, 0xd8,
+	0x9d, 0x81, 0xfc, 0x73, 0xa5, 0x1e, 0xc2, 0xb2, 0x20, 0xb4, 0xef, 0xc9, 0x33, 0xce, 0x06, 0xc1,
+	0x59, 0x5a, 0xeb, 0x2d, 0x6a, 0xa9, 0x28, 0xec, 0xd8, 0x50, 0xb3, 0x62, 0xcb, 0xff, 0x7e, 0x6c,
+	0x9f, 0xa1, 0x9a, 0x70, 0x76, 0x39, 0x1c, 0x9b, 0x9a, 0x62, 0xb7, 0x6f, 0x30, 0xed, 0x2a, 0x28,
+	0xf5, 0x5c, 0xd1, 0x0e, 0x99, 0xe5, 0xd4, 0x08, 0x35, 0xbe, 0xe5, 0xa0, 0x98, 0xe6, 0xf9, 0x0a,
+	0x96, 0x42, 0xf3, 0xfd, 0xd8, 0x56, 0x3d, 0xdf, 0xac, 0x5c, 0x3d, 0x38, 0xe6, 0x7c, 0x5a, 0xee,
+	0x88, 0x41, 0x6f, 0xa0, 0xc4, 0xd2, 0xaa, 0xec, 0x9c, 0xe6, 0x37, 0x26, 0xf9, 0x79, 0x35, 0xba,
+	0x19, 0x85, 0x5a, 0x90, 0x8f, 0x58, 0x90, 0x46, 0xb7, 0x36, 0xa3, 0x83, 0x88, 0x05, 0x4e, 0x4a,
+	0x29, 0x25, 0xda, 0x81, 0x3c, 0x4e, 0x12, 0xbb, 0xa0, 0x57, 0xbb, 0x6d, 0xf9, 0x0a, 0x41, 0x2f,
+	0xa1, 0x9c, 0x25, 0x97, 0xc6, 0x7a, 0x77, 0x76, 0xac, 0xe9, 0x7a, 0x63, 0xf9, 0xf6, 0x16, 0x2c,
+	0x9b, 0x9b, 0xef, 0x18, 0x8f, 0xb1, 0x54, 0xc7, 0x50, 0x57, 0x9d, 0xfb, 0x27, 0x83, 0xd3, 0xda,
+	0x02, 0x2a, 0x41, 0xe1, 0x7d, 0xaf, 0xf3, 0xa9, 0x66, 0xed, 0xaf, 0x43, 0xd5, 0x67, 0xf1, 0x84,
+	0xeb, 0x7e, 0xc5, 0x70, 0x5a, 0xfd, 0xa5, 0xa0, 0x6e, 0x9d, 0x14, 0xf5, 0x5f, 0xc6, 0xb3, 0x9f,
+	0x01, 0x00, 0x00, 0xff, 0xff, 0x0d, 0xbe, 0x70, 0x63, 0x5d, 0x07, 0x00, 0x00,
 }

+ 4 - 4
config.proto

@@ -5,7 +5,7 @@ option go_package = "core";
 option java_package = "com.v2ray.core";
 option java_outer_classname = "ConfigProto";
 
-import "v2ray.com/core/common/loader/type.proto";
+import "v2ray.com/core/common/serial/typed_message.proto";
 import "v2ray.com/core/common/net/port.proto";
 import "v2ray.com/core/common/net/address.proto";
 import "v2ray.com/core/common/log/config.proto";
@@ -52,7 +52,7 @@ message AllocationStrategy {
 // Config for an inbound connection handler.
 message InboundConnectionConfig {
   // Protocol specific settings. Must be one of the supported protocols.
-  v2ray.core.common.loader.TypedSettings settings = 1;
+  v2ray.core.common.serial.TypedMessage settings = 1;
 
   // Range of port number to run on. Both inclusive.
   v2ray.core.common.net.PortRange port_range = 2;
@@ -72,7 +72,7 @@ message InboundConnectionConfig {
 
 // Config for an outbound connection handler.
 message OutboundConnectionConfig {
-  v2ray.core.common.loader.TypedSettings settings = 1;
+  v2ray.core.common.serial.TypedMessage settings = 1;
 
   // IP address to send data through. 0.0.0.0 if unset.
   v2ray.core.common.net.IPOrDomain send_through = 2;
@@ -90,6 +90,6 @@ message Config {
   v2ray.core.common.log.Config log = 3;
 
   // App configuration. Must be one in the app directory.
-  repeated v2ray.core.common.loader.TypedSettings app = 4;
+  repeated v2ray.core.common.serial.TypedMessage app = 4;
   v2ray.core.transport.Config transport = 5;
 }

+ 13 - 13
proxy/blackhole/config.pb.go

@@ -18,7 +18,7 @@ package blackhole
 import proto "github.com/golang/protobuf/proto"
 import fmt "fmt"
 import math "math"
-import v2ray_core_common_loader "v2ray.com/core/common/loader"
+import v2ray_core_common_serial "v2ray.com/core/common/serial"
 
 // Reference imports to suppress errors if they are not otherwise used.
 var _ = proto.Marshal
@@ -48,7 +48,7 @@ func (*HTTPResponse) ProtoMessage()               {}
 func (*HTTPResponse) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{1} }
 
 type Config struct {
-	Response *v2ray_core_common_loader.TypedSettings `protobuf:"bytes,1,opt,name=response" json:"response,omitempty"`
+	Response *v2ray_core_common_serial.TypedMessage `protobuf:"bytes,1,opt,name=response" json:"response,omitempty"`
 }
 
 func (m *Config) Reset()                    { *m = Config{} }
@@ -56,7 +56,7 @@ func (m *Config) String() string            { return proto.CompactTextString(m)
 func (*Config) ProtoMessage()               {}
 func (*Config) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{2} }
 
-func (m *Config) GetResponse() *v2ray_core_common_loader.TypedSettings {
+func (m *Config) GetResponse() *v2ray_core_common_serial.TypedMessage {
 	if m != nil {
 		return m.Response
 	}
@@ -72,18 +72,18 @@ func init() {
 func init() { proto.RegisterFile("v2ray.com/core/proxy/blackhole/config.proto", fileDescriptor0) }
 
 var fileDescriptor0 = []byte{
-	// 203 bytes of a gzipped FileDescriptorProto
+	// 205 bytes of a gzipped FileDescriptorProto
 	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x09, 0x6e, 0x88, 0x02, 0xff, 0xe2, 0xd2, 0x2e, 0x33, 0x2a, 0x4a,
 	0xac, 0xd4, 0x4b, 0xce, 0xcf, 0xd5, 0x4f, 0xce, 0x2f, 0x4a, 0xd5, 0x2f, 0x28, 0xca, 0xaf, 0xa8,
 	0xd4, 0x4f, 0xca, 0x49, 0x4c, 0xce, 0xce, 0xc8, 0xcf, 0x49, 0xd5, 0x4f, 0xce, 0xcf, 0x4b, 0xcb,
 	0x4c, 0xd7, 0x2b, 0x28, 0xca, 0x2f, 0xc9, 0x17, 0x92, 0x82, 0x29, 0x2e, 0x4a, 0xd5, 0x03, 0x2b,
-	0xd4, 0x83, 0x2b, 0x94, 0x52, 0x47, 0x33, 0x28, 0x39, 0x3f, 0x37, 0x37, 0x3f, 0x4f, 0x3f, 0x27,
-	0x3f, 0x31, 0x25, 0xb5, 0x48, 0xbf, 0xa4, 0xb2, 0x20, 0x15, 0x62, 0x88, 0x12, 0x1f, 0x17, 0x8f,
-	0x5f, 0x7e, 0x5e, 0x6a, 0x50, 0x6a, 0x71, 0x41, 0x7e, 0x5e, 0x71, 0x2a, 0x88, 0xef, 0x11, 0x12,
-	0x12, 0x00, 0xe7, 0xfb, 0x72, 0xb1, 0x39, 0x83, 0x2d, 0x15, 0x72, 0xe6, 0xe2, 0x28, 0x82, 0x8a,
-	0x4a, 0x30, 0x2a, 0x30, 0x6a, 0x70, 0x1b, 0xa9, 0xeb, 0x21, 0xb9, 0x00, 0x62, 0x83, 0x1e, 0xc4,
-	0x06, 0xbd, 0x90, 0xca, 0x82, 0xd4, 0x94, 0xe0, 0xd4, 0x92, 0x92, 0xcc, 0xbc, 0xf4, 0xe2, 0x20,
-	0xb8, 0x46, 0x27, 0x0b, 0x2e, 0xb9, 0xe4, 0xfc, 0x5c, 0x3d, 0xdc, 0x2e, 0x77, 0xe2, 0x86, 0x58,
-	0x17, 0x00, 0x72, 0x5d, 0x14, 0x27, 0x5c, 0x3c, 0x89, 0x0d, 0xec, 0x5e, 0x63, 0x40, 0x00, 0x00,
-	0x00, 0xff, 0xff, 0x27, 0x0a, 0x95, 0x10, 0x23, 0x01, 0x00, 0x00,
+	0xd4, 0x83, 0x2b, 0x94, 0x32, 0x40, 0x33, 0x28, 0x39, 0x3f, 0x37, 0x37, 0x3f, 0x4f, 0xbf, 0x38,
+	0xb5, 0x28, 0x33, 0x31, 0x47, 0xbf, 0xa4, 0xb2, 0x20, 0x35, 0x25, 0x3e, 0x37, 0xb5, 0xb8, 0x38,
+	0x31, 0x3d, 0x15, 0x62, 0x9a, 0x12, 0x1f, 0x17, 0x8f, 0x5f, 0x7e, 0x5e, 0x6a, 0x50, 0x6a, 0x71,
+	0x41, 0x7e, 0x5e, 0x71, 0x2a, 0x88, 0xef, 0x11, 0x12, 0x12, 0x00, 0xe7, 0xfb, 0x70, 0xb1, 0x39,
+	0x83, 0x6d, 0x17, 0x72, 0xe2, 0xe2, 0x28, 0x82, 0x8a, 0x4a, 0x30, 0x2a, 0x30, 0x6a, 0x70, 0x1b,
+	0xa9, 0xe9, 0x21, 0x39, 0x05, 0x62, 0x95, 0x1e, 0xc4, 0x2a, 0xbd, 0x10, 0x90, 0x55, 0xbe, 0x10,
+	0x9b, 0x82, 0xe0, 0xfa, 0x9c, 0x2c, 0xb8, 0xe4, 0x92, 0xf3, 0x73, 0xf5, 0x70, 0xfb, 0xc0, 0x89,
+	0x1b, 0x62, 0x5b, 0x00, 0xc8, 0x71, 0x51, 0x9c, 0x70, 0xf1, 0x24, 0x36, 0xb0, 0x73, 0x8d, 0x01,
+	0x01, 0x00, 0x00, 0xff, 0xff, 0x0b, 0x03, 0x0e, 0x8c, 0x2b, 0x01, 0x00, 0x00,
 }

+ 2 - 2
proxy/blackhole/config.proto

@@ -5,7 +5,7 @@ option go_package = "blackhole";
 option java_package = "com.v2ray.core.proxy.blackhole";
 option java_outer_classname = "ConfigProto";
 
-import "v2ray.com/core/common/loader/type.proto";
+import "v2ray.com/core/common/serial/typed_message.proto";
 
 message NoneResponse {
 }
@@ -14,5 +14,5 @@ message HTTPResponse {
 }
 
 message Config {
-  v2ray.core.common.loader.TypedSettings response = 1;
+  v2ray.core.common.serial.TypedMessage response = 1;
 }

+ 2 - 2
proxy/blackhole/init.go

@@ -1,11 +1,11 @@
 package blackhole
 
 import (
-	"v2ray.com/core/common/loader"
+	"v2ray.com/core/common/serial"
 	"v2ray.com/core/proxy/registry"
 )
 
 func init() {
 	// Must listed after config.pb.go
-	registry.MustRegisterOutboundHandlerCreator(loader.GetType(new(Config)), new(Factory))
+	registry.MustRegisterOutboundHandlerCreator(serial.GetMessageType(new(Config)), new(Factory))
 }

+ 2 - 2
proxy/dokodemo/dokodemo.go

@@ -7,9 +7,9 @@ import (
 	"v2ray.com/core/app/dispatcher"
 	"v2ray.com/core/common/buf"
 	"v2ray.com/core/common/errors"
-	"v2ray.com/core/common/loader"
 	"v2ray.com/core/common/log"
 	v2net "v2ray.com/core/common/net"
+	"v2ray.com/core/common/serial"
 	"v2ray.com/core/proxy"
 	"v2ray.com/core/proxy/registry"
 	"v2ray.com/core/transport/internet"
@@ -212,5 +212,5 @@ func (v *Factory) Create(space app.Space, rawConfig interface{}, meta *proxy.Inb
 }
 
 func init() {
-	registry.MustRegisterInboundHandlerCreator(loader.GetType(new(Config)), new(Factory))
+	registry.MustRegisterInboundHandlerCreator(serial.GetMessageType(new(Config)), new(Factory))
 }

+ 2 - 2
proxy/freedom/freedom.go

@@ -8,10 +8,10 @@ import (
 	"v2ray.com/core/common/buf"
 	"v2ray.com/core/common/dice"
 	"v2ray.com/core/common/errors"
-	"v2ray.com/core/common/loader"
 	"v2ray.com/core/common/log"
 	v2net "v2ray.com/core/common/net"
 	"v2ray.com/core/common/retry"
+	"v2ray.com/core/common/serial"
 	"v2ray.com/core/proxy"
 	"v2ray.com/core/proxy/registry"
 	"v2ray.com/core/transport/internet"
@@ -142,5 +142,5 @@ func (v *FreedomFactory) Create(space app.Space, config interface{}, meta *proxy
 }
 
 func init() {
-	registry.MustRegisterOutboundHandlerCreator(loader.GetType(new(Config)), new(FreedomFactory))
+	registry.MustRegisterOutboundHandlerCreator(serial.GetMessageType(new(Config)), new(FreedomFactory))
 }

+ 2 - 2
proxy/http/server.go

@@ -14,9 +14,9 @@ import (
 	"v2ray.com/core/common/buf"
 	"v2ray.com/core/common/bufio"
 	"v2ray.com/core/common/errors"
-	"v2ray.com/core/common/loader"
 	"v2ray.com/core/common/log"
 	v2net "v2ray.com/core/common/net"
+	"v2ray.com/core/common/serial"
 	"v2ray.com/core/proxy"
 	"v2ray.com/core/proxy/registry"
 	"v2ray.com/core/transport/internet"
@@ -288,5 +288,5 @@ func (v *ServerFactory) Create(space app.Space, rawConfig interface{}, meta *pro
 }
 
 func init() {
-	registry.MustRegisterInboundHandlerCreator(loader.GetType(new(ServerConfig)), new(ServerFactory))
+	registry.MustRegisterInboundHandlerCreator(serial.GetMessageType(new(ServerConfig)), new(ServerFactory))
 }

+ 3 - 3
proxy/shadowsocks/init.go

@@ -1,12 +1,12 @@
 package shadowsocks
 
 import (
-	"v2ray.com/core/common/loader"
+	"v2ray.com/core/common/serial"
 	"v2ray.com/core/proxy/registry"
 )
 
 func init() {
 	// Must happen after config is initialized
-	registry.MustRegisterOutboundHandlerCreator(loader.GetType(new(ClientConfig)), new(ClientFactory))
-	registry.MustRegisterInboundHandlerCreator(loader.GetType(new(ServerConfig)), new(ServerFactory))
+	registry.MustRegisterOutboundHandlerCreator(serial.GetMessageType(new(ClientConfig)), new(ClientFactory))
+	registry.MustRegisterInboundHandlerCreator(serial.GetMessageType(new(ServerConfig)), new(ServerFactory))
 }

+ 3 - 4
proxy/shadowsocks/protocol_test.go

@@ -4,7 +4,6 @@ import (
 	"testing"
 
 	"v2ray.com/core/common/buf"
-	"v2ray.com/core/common/loader"
 	v2net "v2ray.com/core/common/net"
 	"v2ray.com/core/common/protocol"
 	"v2ray.com/core/common/serial"
@@ -22,7 +21,7 @@ func TestUDPEncoding(t *testing.T) {
 		Port:    1234,
 		User: &protocol.User{
 			Email: "love@v2ray.com",
-			Account: loader.NewTypedSettings(&Account{
+			Account: serial.ToTypedMessage(&Account{
 				Password:   "shadowsocks-password",
 				CipherType: CipherType_AES_128_CFB,
 				Ota:        Account_Disabled,
@@ -53,7 +52,7 @@ func TestTCPRequest(t *testing.T) {
 		Port:    1234,
 		User: &protocol.User{
 			Email: "love@v2ray.com",
-			Account: loader.NewTypedSettings(&Account{
+			Account: serial.ToTypedMessage(&Account{
 				Password:   "tcp-password",
 				CipherType: CipherType_CHACHA20,
 			}),
@@ -83,7 +82,7 @@ func TestUDPReaderWriter(t *testing.T) {
 	assert := assert.On(t)
 
 	user := &protocol.User{
-		Account: loader.NewTypedSettings(&Account{
+		Account: serial.ToTypedMessage(&Account{
 			Password:   "test-password",
 			CipherType: CipherType_CHACHA20_IEFT,
 		}),

+ 2 - 2
proxy/socks/server.go

@@ -11,9 +11,9 @@ import (
 	"v2ray.com/core/common/bufio"
 	"v2ray.com/core/common/crypto"
 	"v2ray.com/core/common/errors"
-	"v2ray.com/core/common/loader"
 	"v2ray.com/core/common/log"
 	v2net "v2ray.com/core/common/net"
+	"v2ray.com/core/common/serial"
 	"v2ray.com/core/proxy"
 	"v2ray.com/core/proxy/registry"
 	"v2ray.com/core/proxy/socks/protocol"
@@ -334,5 +334,5 @@ func (v *ServerFactory) Create(space app.Space, rawConfig interface{}, meta *pro
 }
 
 func init() {
-	registry.MustRegisterInboundHandlerCreator(loader.GetType(new(ServerConfig)), new(ServerFactory))
+	registry.MustRegisterInboundHandlerCreator(serial.GetMessageType(new(ServerConfig)), new(ServerFactory))
 }

+ 2 - 2
proxy/vmess/encoding/encoding_test.go

@@ -4,9 +4,9 @@ import (
 	"testing"
 
 	"v2ray.com/core/common/buf"
-	"v2ray.com/core/common/loader"
 	v2net "v2ray.com/core/common/net"
 	"v2ray.com/core/common/protocol"
+	"v2ray.com/core/common/serial"
 	"v2ray.com/core/common/uuid"
 	"v2ray.com/core/proxy/vmess"
 	. "v2ray.com/core/proxy/vmess/encoding"
@@ -24,7 +24,7 @@ func TestRequestSerialization(t *testing.T) {
 		Id:      uuid.New().String(),
 		AlterId: 0,
 	}
-	user.Account = loader.NewTypedSettings(account)
+	user.Account = serial.ToTypedMessage(account)
 
 	expectedRequest := &protocol.RequestHeader{
 		Version:  1,

+ 3 - 3
proxy/vmess/inbound/inbound.go

@@ -11,10 +11,10 @@ import (
 	"v2ray.com/core/common/buf"
 	"v2ray.com/core/common/bufio"
 	"v2ray.com/core/common/errors"
-	"v2ray.com/core/common/loader"
 	"v2ray.com/core/common/log"
 	v2net "v2ray.com/core/common/net"
 	"v2ray.com/core/common/protocol"
+	"v2ray.com/core/common/serial"
 	"v2ray.com/core/common/uuid"
 	"v2ray.com/core/proxy"
 	"v2ray.com/core/proxy/registry"
@@ -59,7 +59,7 @@ func (v *userByEmail) Get(email string) (*protocol.User, bool) {
 			user = &protocol.User{
 				Level:   v.defaultLevel,
 				Email:   email,
-				Account: loader.NewTypedSettings(account),
+				Account: serial.ToTypedMessage(account),
 			}
 			v.cache[email] = user
 		}
@@ -272,5 +272,5 @@ func (v *Factory) Create(space app.Space, rawConfig interface{}, meta *proxy.Inb
 }
 
 func init() {
-	registry.MustRegisterInboundHandlerCreator(loader.GetType(new(Config)), new(Factory))
+	registry.MustRegisterInboundHandlerCreator(serial.GetMessageType(new(Config)), new(Factory))
 }

+ 2 - 2
proxy/vmess/outbound/command.go

@@ -3,9 +3,9 @@ package outbound
 import (
 	"time"
 
-	"v2ray.com/core/common/loader"
 	v2net "v2ray.com/core/common/net"
 	"v2ray.com/core/common/protocol"
+	"v2ray.com/core/common/serial"
 	"v2ray.com/core/proxy/vmess"
 )
 
@@ -18,7 +18,7 @@ func (v *VMessOutboundHandler) handleSwitchAccount(cmd *protocol.CommandSwitchAc
 	user := &protocol.User{
 		Email:   "",
 		Level:   cmd.Level,
-		Account: loader.NewTypedSettings(account),
+		Account: serial.ToTypedMessage(account),
 	}
 	dest := v2net.TCPDestination(cmd.Host, cmd.Port)
 	until := time.Now().Add(time.Duration(cmd.ValidMin) * time.Minute)

+ 2 - 2
proxy/vmess/outbound/outbound.go

@@ -6,11 +6,11 @@ import (
 	"v2ray.com/core/app"
 	"v2ray.com/core/common/buf"
 	"v2ray.com/core/common/bufio"
-	"v2ray.com/core/common/loader"
 	"v2ray.com/core/common/log"
 	v2net "v2ray.com/core/common/net"
 	"v2ray.com/core/common/protocol"
 	"v2ray.com/core/common/retry"
+	"v2ray.com/core/common/serial"
 	"v2ray.com/core/proxy"
 	"v2ray.com/core/proxy/registry"
 	"v2ray.com/core/proxy/vmess"
@@ -176,5 +176,5 @@ func (v *Factory) Create(space app.Space, rawConfig interface{}, meta *proxy.Out
 }
 
 func init() {
-	registry.MustRegisterOutboundHandlerCreator(loader.GetType(new(Config)), new(Factory))
+	registry.MustRegisterOutboundHandlerCreator(serial.GetMessageType(new(Config)), new(Factory))
 }

+ 7 - 7
tools/conf/blackhole.go

@@ -3,27 +3,27 @@ package conf
 import (
 	"encoding/json"
 	"v2ray.com/core/common/errors"
-	"v2ray.com/core/common/loader"
+	"v2ray.com/core/common/serial"
 	"v2ray.com/core/proxy/blackhole"
 )
 
 type NoneResponse struct{}
 
-func (*NoneResponse) Build() (*loader.TypedSettings, error) {
-	return loader.NewTypedSettings(new(blackhole.NoneResponse)), nil
+func (*NoneResponse) Build() (*serial.TypedMessage, error) {
+	return serial.ToTypedMessage(new(blackhole.NoneResponse)), nil
 }
 
 type HttpResponse struct{}
 
-func (*HttpResponse) Build() (*loader.TypedSettings, error) {
-	return loader.NewTypedSettings(new(blackhole.HTTPResponse)), nil
+func (*HttpResponse) Build() (*serial.TypedMessage, error) {
+	return serial.ToTypedMessage(new(blackhole.HTTPResponse)), nil
 }
 
 type BlackholeConfig struct {
 	Response json.RawMessage `json:"response"`
 }
 
-func (v *BlackholeConfig) Build() (*loader.TypedSettings, error) {
+func (v *BlackholeConfig) Build() (*serial.TypedMessage, error) {
 	config := new(blackhole.Config)
 	if v.Response != nil {
 		response, _, err := configLoader.Load(v.Response)
@@ -37,7 +37,7 @@ func (v *BlackholeConfig) Build() (*loader.TypedSettings, error) {
 		config.Response = responseSettings
 	}
 
-	return loader.NewTypedSettings(config), nil
+	return serial.ToTypedMessage(config), nil
 }
 
 var (

+ 2 - 2
tools/conf/builable.go

@@ -1,9 +1,9 @@
 package conf
 
 import (
-	"v2ray.com/core/common/loader"
+	"v2ray.com/core/common/serial"
 )
 
 type Buildable interface {
-	Build() (*loader.TypedSettings, error)
+	Build() (*serial.TypedMessage, error)
 }

+ 3 - 3
tools/conf/dokodemo.go

@@ -1,7 +1,7 @@
 package conf
 
 import (
-	"v2ray.com/core/common/loader"
+	"v2ray.com/core/common/serial"
 	"v2ray.com/core/proxy/dokodemo"
 )
 
@@ -13,7 +13,7 @@ type DokodemoConfig struct {
 	Redirect     bool         `json:"followRedirect"`
 }
 
-func (v *DokodemoConfig) Build() (*loader.TypedSettings, error) {
+func (v *DokodemoConfig) Build() (*serial.TypedMessage, error) {
 	config := new(dokodemo.Config)
 	if v.Host != nil {
 		config.Address = v.Host.Build()
@@ -22,5 +22,5 @@ func (v *DokodemoConfig) Build() (*loader.TypedSettings, error) {
 	config.NetworkList = v.NetworkList.Build()
 	config.Timeout = v.TimeoutValue
 	config.FollowRedirect = v.Redirect
-	return loader.NewTypedSettings(config), nil
+	return serial.ToTypedMessage(config), nil
 }

+ 3 - 3
tools/conf/freedom.go

@@ -3,7 +3,7 @@ package conf
 import (
 	"strings"
 
-	"v2ray.com/core/common/loader"
+	"v2ray.com/core/common/serial"
 	"v2ray.com/core/proxy/freedom"
 )
 
@@ -12,7 +12,7 @@ type FreedomConfig struct {
 	Timeout        uint32 `json:"timeout"`
 }
 
-func (v *FreedomConfig) Build() (*loader.TypedSettings, error) {
+func (v *FreedomConfig) Build() (*serial.TypedMessage, error) {
 	config := new(freedom.Config)
 	config.DomainStrategy = freedom.Config_AS_IS
 	domainStrategy := strings.ToLower(v.DomainStrategy)
@@ -20,5 +20,5 @@ func (v *FreedomConfig) Build() (*loader.TypedSettings, error) {
 		config.DomainStrategy = freedom.Config_USE_IP
 	}
 	config.Timeout = v.Timeout
-	return loader.NewTypedSettings(config), nil
+	return serial.ToTypedMessage(config), nil
 }

+ 3 - 3
tools/conf/http.go

@@ -1,7 +1,7 @@
 package conf
 
 import (
-	"v2ray.com/core/common/loader"
+	"v2ray.com/core/common/serial"
 	"v2ray.com/core/proxy/http"
 )
 
@@ -9,10 +9,10 @@ type HttpServerConfig struct {
 	Timeout uint32 `json:"timeout"`
 }
 
-func (v *HttpServerConfig) Build() (*loader.TypedSettings, error) {
+func (v *HttpServerConfig) Build() (*serial.TypedMessage, error) {
 	config := &http.ServerConfig{
 		Timeout: v.Timeout,
 	}
 
-	return loader.NewTypedSettings(config), nil
+	return serial.ToTypedMessage(config), nil
 }

+ 7 - 7
tools/conf/shadowsocks.go

@@ -3,8 +3,8 @@ package conf
 import (
 	"strings"
 	"v2ray.com/core/common/errors"
-	"v2ray.com/core/common/loader"
 	"v2ray.com/core/common/protocol"
+	"v2ray.com/core/common/serial"
 	"v2ray.com/core/proxy/shadowsocks"
 )
 
@@ -17,7 +17,7 @@ type ShadowsocksServerConfig struct {
 	OTA      *bool  `json:"ota"`
 }
 
-func (v *ShadowsocksServerConfig) Build() (*loader.TypedSettings, error) {
+func (v *ShadowsocksServerConfig) Build() (*serial.TypedMessage, error) {
 	config := new(shadowsocks.ServerConfig)
 	config.UdpEnabled = v.UDP
 
@@ -52,10 +52,10 @@ func (v *ShadowsocksServerConfig) Build() (*loader.TypedSettings, error) {
 	config.User = &protocol.User{
 		Email:   v.Email,
 		Level:   uint32(v.Level),
-		Account: loader.NewTypedSettings(account),
+		Account: serial.ToTypedMessage(account),
 	}
 
-	return loader.NewTypedSettings(config), nil
+	return serial.ToTypedMessage(config), nil
 }
 
 type ShadowsocksServerTarget struct {
@@ -71,7 +71,7 @@ type ShadowsocksClientConfig struct {
 	Servers []*ShadowsocksServerTarget `json:"servers"`
 }
 
-func (v *ShadowsocksClientConfig) Build() (*loader.TypedSettings, error) {
+func (v *ShadowsocksClientConfig) Build() (*serial.TypedMessage, error) {
 	config := new(shadowsocks.ClientConfig)
 
 	if len(v.Servers) == 0 {
@@ -116,7 +116,7 @@ func (v *ShadowsocksClientConfig) Build() (*loader.TypedSettings, error) {
 			User: []*protocol.User{
 				{
 					Email:   server.Email,
-					Account: loader.NewTypedSettings(account),
+					Account: serial.ToTypedMessage(account),
 				},
 			},
 		}
@@ -126,5 +126,5 @@ func (v *ShadowsocksClientConfig) Build() (*loader.TypedSettings, error) {
 
 	config.Server = serverSpecs
 
-	return loader.NewTypedSettings(config), nil
+	return serial.ToTypedMessage(config), nil
 }

+ 6 - 6
tools/conf/socks.go

@@ -3,8 +3,8 @@ package conf
 import (
 	"encoding/json"
 	"v2ray.com/core/common/errors"
-	"v2ray.com/core/common/loader"
 	"v2ray.com/core/common/protocol"
+	"v2ray.com/core/common/serial"
 	"v2ray.com/core/proxy/socks"
 )
 
@@ -33,7 +33,7 @@ type SocksServerConfig struct {
 	Timeout    uint32          `json:"timeout"`
 }
 
-func (v *SocksServerConfig) Build() (*loader.TypedSettings, error) {
+func (v *SocksServerConfig) Build() (*serial.TypedMessage, error) {
 	config := new(socks.ServerConfig)
 	if v.AuthMethod == AuthMethodNoAuth {
 		config.AuthType = socks.AuthType_NO_AUTH
@@ -56,7 +56,7 @@ func (v *SocksServerConfig) Build() (*loader.TypedSettings, error) {
 	}
 
 	config.Timeout = v.Timeout
-	return loader.NewTypedSettings(config), nil
+	return serial.ToTypedMessage(config), nil
 }
 
 type SocksRemoteConfig struct {
@@ -68,7 +68,7 @@ type SocksClientConfig struct {
 	Servers []*SocksRemoteConfig `json:"servers"`
 }
 
-func (v *SocksClientConfig) Build() (*loader.TypedSettings, error) {
+func (v *SocksClientConfig) Build() (*serial.TypedMessage, error) {
 	config := new(socks.ClientConfig)
 	config.Server = make([]*protocol.ServerEndpoint, len(v.Servers))
 	for idx, serverConfig := range v.Servers {
@@ -85,10 +85,10 @@ func (v *SocksClientConfig) Build() (*loader.TypedSettings, error) {
 			if err := json.Unmarshal(rawUser, account); err != nil {
 				return nil, errors.Base(err).Message("Socks|Client: Failed to parse socks account.")
 			}
-			user.Account = loader.NewTypedSettings(account.Build())
+			user.Account = serial.ToTypedMessage(account.Build())
 			server.User = append(server.User, user)
 		}
 		config.Server[idx] = server
 	}
-	return loader.NewTypedSettings(config), nil
+	return serial.ToTypedMessage(config), nil
 }

+ 11 - 11
tools/conf/transport_authenticators.go

@@ -2,7 +2,7 @@ package conf
 
 import (
 	"v2ray.com/core/common/errors"
-	"v2ray.com/core/common/loader"
+	"v2ray.com/core/common/serial"
 	"v2ray.com/core/transport/internet/headers/http"
 	"v2ray.com/core/transport/internet/headers/noop"
 	"v2ray.com/core/transport/internet/headers/srtp"
@@ -11,26 +11,26 @@ import (
 
 type NoOpAuthenticator struct{}
 
-func (NoOpAuthenticator) Build() (*loader.TypedSettings, error) {
-	return loader.NewTypedSettings(new(noop.Config)), nil
+func (NoOpAuthenticator) Build() (*serial.TypedMessage, error) {
+	return serial.ToTypedMessage(new(noop.Config)), nil
 }
 
 type NoOpConnectionAuthenticator struct{}
 
-func (NoOpConnectionAuthenticator) Build() (*loader.TypedSettings, error) {
-	return loader.NewTypedSettings(new(noop.Config)), nil
+func (NoOpConnectionAuthenticator) Build() (*serial.TypedMessage, error) {
+	return serial.ToTypedMessage(new(noop.Config)), nil
 }
 
 type SRTPAuthenticator struct{}
 
-func (SRTPAuthenticator) Build() (*loader.TypedSettings, error) {
-	return loader.NewTypedSettings(new(srtp.Config)), nil
+func (SRTPAuthenticator) Build() (*serial.TypedMessage, error) {
+	return serial.ToTypedMessage(new(srtp.Config)), nil
 }
 
 type UTPAuthenticator struct{}
 
-func (UTPAuthenticator) Build() (*loader.TypedSettings, error) {
-	return loader.NewTypedSettings(new(utp.Config)), nil
+func (UTPAuthenticator) Build() (*serial.TypedMessage, error) {
+	return serial.ToTypedMessage(new(utp.Config)), nil
 }
 
 type HTTPAuthenticatorRequest struct {
@@ -169,7 +169,7 @@ type HTTPAuthenticator struct {
 	Response HTTPAuthenticatorResponse `json:"response"`
 }
 
-func (v *HTTPAuthenticator) Build() (*loader.TypedSettings, error) {
+func (v *HTTPAuthenticator) Build() (*serial.TypedMessage, error) {
 	config := new(http.Config)
 	requestConfig, err := v.Request.Build()
 	if err != nil {
@@ -183,5 +183,5 @@ func (v *HTTPAuthenticator) Build() (*loader.TypedSettings, error) {
 	}
 	config.Response = responseConfig
 
-	return loader.NewTypedSettings(config), nil
+	return serial.ToTypedMessage(config), nil
 }

+ 9 - 9
tools/conf/transport_internet.go

@@ -6,8 +6,8 @@ import (
 	"strings"
 
 	"v2ray.com/core/common/errors"
-	"v2ray.com/core/common/loader"
 	v2net "v2ray.com/core/common/net"
+	"v2ray.com/core/common/serial"
 	"v2ray.com/core/transport/internet"
 	"v2ray.com/core/transport/internet/kcp"
 	"v2ray.com/core/transport/internet/tcp"
@@ -39,7 +39,7 @@ type KCPConfig struct {
 	HeaderConfig    json.RawMessage `json:"header"`
 }
 
-func (v *KCPConfig) Build() (*loader.TypedSettings, error) {
+func (v *KCPConfig) Build() (*serial.TypedMessage, error) {
 	config := new(kcp.Config)
 
 	if v.Mtu != nil {
@@ -93,7 +93,7 @@ func (v *KCPConfig) Build() (*loader.TypedSettings, error) {
 		config.HeaderConfig = ts
 	}
 
-	return loader.NewTypedSettings(config), nil
+	return serial.ToTypedMessage(config), nil
 }
 
 type TCPConfig struct {
@@ -101,7 +101,7 @@ type TCPConfig struct {
 	HeaderConfig    json.RawMessage `json:"header"`
 }
 
-func (v *TCPConfig) Build() (*loader.TypedSettings, error) {
+func (v *TCPConfig) Build() (*serial.TypedMessage, error) {
 	config := new(tcp.Config)
 	if v.ConnectionReuse != nil {
 		config.ConnectionReuse = &tcp.ConnectionReuse{
@@ -120,7 +120,7 @@ func (v *TCPConfig) Build() (*loader.TypedSettings, error) {
 		config.HeaderSettings = ts
 	}
 
-	return loader.NewTypedSettings(config), nil
+	return serial.ToTypedMessage(config), nil
 }
 
 type WebSocketConfig struct {
@@ -128,7 +128,7 @@ type WebSocketConfig struct {
 	Path            string `json:"Path"`
 }
 
-func (v *WebSocketConfig) Build() (*loader.TypedSettings, error) {
+func (v *WebSocketConfig) Build() (*serial.TypedMessage, error) {
 	config := &ws.Config{
 		Path: v.Path,
 	}
@@ -137,7 +137,7 @@ func (v *WebSocketConfig) Build() (*loader.TypedSettings, error) {
 			Enable: *v.ConnectionReuse,
 		}
 	}
-	return loader.NewTypedSettings(config), nil
+	return serial.ToTypedMessage(config), nil
 }
 
 type TLSCertConfig struct {
@@ -150,7 +150,7 @@ type TLSConfig struct {
 	ServerName string           `json:"serverName"`
 }
 
-func (v *TLSConfig) Build() (*loader.TypedSettings, error) {
+func (v *TLSConfig) Build() (*serial.TypedMessage, error) {
 	config := new(tls.Config)
 	config.Certificate = make([]*tls.Certificate, len(v.Certs))
 	for idx, certConf := range v.Certs {
@@ -171,7 +171,7 @@ func (v *TLSConfig) Build() (*loader.TypedSettings, error) {
 	if len(v.ServerName) > 0 {
 		config.ServerName = v.ServerName
 	}
-	return loader.NewTypedSettings(config), nil
+	return serial.ToTypedMessage(config), nil
 }
 
 type StreamConfig struct {

+ 3 - 3
tools/conf/v2ray.go

@@ -6,8 +6,8 @@ import (
 	"strings"
 	"v2ray.com/core"
 	"v2ray.com/core/common/errors"
-	"v2ray.com/core/common/loader"
 	v2net "v2ray.com/core/common/net"
+	"v2ray.com/core/common/serial"
 	json_reader "v2ray.com/core/tools/conf/json"
 )
 
@@ -289,11 +289,11 @@ func (v *Config) Build() (*core.Config, error) {
 		if err != nil {
 			return nil, err
 		}
-		config.App = append(config.App, loader.NewTypedSettings(routerConfig))
+		config.App = append(config.App, serial.ToTypedMessage(routerConfig))
 	}
 
 	if v.DNSConfig != nil {
-		config.App = append(config.App, loader.NewTypedSettings(v.DNSConfig.Build()))
+		config.App = append(config.App, serial.ToTypedMessage(v.DNSConfig.Build()))
 	}
 
 	if v.InboundConfig == nil {

+ 6 - 7
tools/conf/vmess.go

@@ -5,7 +5,6 @@ import (
 	"strings"
 
 	"v2ray.com/core/common/errors"
-	"v2ray.com/core/common/loader"
 	v2net "v2ray.com/core/common/net"
 	"v2ray.com/core/common/protocol"
 	"v2ray.com/core/common/serial"
@@ -79,7 +78,7 @@ type VMessInboundConfig struct {
 	DetourConfig *VMessDetourConfig  `json:"detour"`
 }
 
-func (v *VMessInboundConfig) Build() (*loader.TypedSettings, error) {
+func (v *VMessInboundConfig) Build() (*serial.TypedMessage, error) {
 	config := new(inbound.Config)
 
 	if v.Defaults != nil {
@@ -102,11 +101,11 @@ func (v *VMessInboundConfig) Build() (*loader.TypedSettings, error) {
 		if err := json.Unmarshal(rawData, account); err != nil {
 			return nil, errors.Base(err).Message("Invalid VMess user.")
 		}
-		user.Account = loader.NewTypedSettings(account.Build())
+		user.Account = serial.ToTypedMessage(account.Build())
 		config.User[idx] = user
 	}
 
-	return loader.NewTypedSettings(config), nil
+	return serial.ToTypedMessage(config), nil
 }
 
 type VMessOutboundTarget struct {
@@ -118,7 +117,7 @@ type VMessOutboundConfig struct {
 	Receivers []*VMessOutboundTarget `json:"vnext"`
 }
 
-func (v *VMessOutboundConfig) Build() (*loader.TypedSettings, error) {
+func (v *VMessOutboundConfig) Build() (*serial.TypedMessage, error) {
 	config := new(outbound.Config)
 
 	if len(v.Receivers) == 0 {
@@ -148,11 +147,11 @@ func (v *VMessOutboundConfig) Build() (*loader.TypedSettings, error) {
 			if err := json.Unmarshal(rawUser, account); err != nil {
 				return nil, errors.Base(err).Message("Invalid VMess user.")
 			}
-			user.Account = loader.NewTypedSettings(account.Build())
+			user.Account = serial.ToTypedMessage(account.Build())
 			spec.User = append(spec.User, user)
 		}
 		serverSpecs[idx] = spec
 	}
 	config.Receiver = serverSpecs
-	return loader.NewTypedSettings(config), nil
+	return serial.ToTypedMessage(config), nil
 }

+ 2 - 2
transport/internet/config.go

@@ -2,7 +2,7 @@ package internet
 
 import (
 	"v2ray.com/core/common/errors"
-	"v2ray.com/core/common/loader"
+	"v2ray.com/core/common/serial"
 	"v2ray.com/core/common/log"
 	v2net "v2ray.com/core/common/net"
 )
@@ -56,7 +56,7 @@ func (v *StreamConfig) GetEffectiveSecuritySettings() (interface{}, error) {
 			return settings.GetInstance()
 		}
 	}
-	return loader.GetInstance(v.SecurityType)
+	return serial.GetInstance(v.SecurityType)
 }
 
 func (v *StreamConfig) HasSecuritySettings() bool {

+ 28 - 27
transport/internet/config.pb.go

@@ -19,7 +19,7 @@ import proto "github.com/golang/protobuf/proto"
 import fmt "fmt"
 import math "math"
 import v2ray_core_common_net "v2ray.com/core/common/net"
-import v2ray_core_common_loader "v2ray.com/core/common/loader"
+import v2ray_core_common_serial "v2ray.com/core/common/serial"
 
 // Reference imports to suppress errors if they are not otherwise used.
 var _ = proto.Marshal
@@ -36,7 +36,7 @@ type NetworkSettings struct {
 	// Type of network that this settings supports.
 	Network v2ray_core_common_net.Network `protobuf:"varint,1,opt,name=network,enum=v2ray.core.common.net.Network" json:"network,omitempty"`
 	// Specific settings.
-	Settings *v2ray_core_common_loader.TypedSettings `protobuf:"bytes,2,opt,name=settings" json:"settings,omitempty"`
+	Settings *v2ray_core_common_serial.TypedMessage `protobuf:"bytes,2,opt,name=settings" json:"settings,omitempty"`
 }
 
 func (m *NetworkSettings) Reset()                    { *m = NetworkSettings{} }
@@ -44,7 +44,7 @@ func (m *NetworkSettings) String() string            { return proto.CompactTextS
 func (*NetworkSettings) ProtoMessage()               {}
 func (*NetworkSettings) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{0} }
 
-func (m *NetworkSettings) GetSettings() *v2ray_core_common_loader.TypedSettings {
+func (m *NetworkSettings) GetSettings() *v2ray_core_common_serial.TypedMessage {
 	if m != nil {
 		return m.Settings
 	}
@@ -56,8 +56,8 @@ type StreamConfig struct {
 	Network         v2ray_core_common_net.Network `protobuf:"varint,1,opt,name=network,enum=v2ray.core.common.net.Network" json:"network,omitempty"`
 	NetworkSettings []*NetworkSettings            `protobuf:"bytes,2,rep,name=network_settings,json=networkSettings" json:"network_settings,omitempty"`
 	// Type of security. Must be a message name of the settings proto.
-	SecurityType     string                                    `protobuf:"bytes,3,opt,name=security_type,json=securityType" json:"security_type,omitempty"`
-	SecuritySettings []*v2ray_core_common_loader.TypedSettings `protobuf:"bytes,4,rep,name=security_settings,json=securitySettings" json:"security_settings,omitempty"`
+	SecurityType     string                                   `protobuf:"bytes,3,opt,name=security_type,json=securityType" json:"security_type,omitempty"`
+	SecuritySettings []*v2ray_core_common_serial.TypedMessage `protobuf:"bytes,4,rep,name=security_settings,json=securitySettings" json:"security_settings,omitempty"`
 }
 
 func (m *StreamConfig) Reset()                    { *m = StreamConfig{} }
@@ -72,7 +72,7 @@ func (m *StreamConfig) GetNetworkSettings() []*NetworkSettings {
 	return nil
 }
 
-func (m *StreamConfig) GetSecuritySettings() []*v2ray_core_common_loader.TypedSettings {
+func (m *StreamConfig) GetSecuritySettings() []*v2ray_core_common_serial.TypedMessage {
 	if m != nil {
 		return m.SecuritySettings
 	}
@@ -97,25 +97,26 @@ func init() {
 func init() { proto.RegisterFile("v2ray.com/core/transport/internet/config.proto", fileDescriptor0) }
 
 var fileDescriptor0 = []byte{
-	// 317 bytes of a gzipped FileDescriptorProto
-	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x09, 0x6e, 0x88, 0x02, 0xff, 0xa4, 0x92, 0xcd, 0x4a, 0xfb, 0x50,
-	0x10, 0xc5, 0x49, 0xfb, 0xe7, 0x6f, 0x7b, 0x5b, 0x6d, 0xcd, 0xaa, 0x08, 0x6a, 0xad, 0x8b, 0x66,
-	0xe3, 0x04, 0xe2, 0xc6, 0xb5, 0xdd, 0x8b, 0xa4, 0xdd, 0xe8, 0xa6, 0xc4, 0xdb, 0xb1, 0x04, 0xcd,
-	0x9d, 0x30, 0x19, 0x3f, 0xf2, 0x16, 0x3e, 0x81, 0xcf, 0x2a, 0xf9, 0xb8, 0xa1, 0x14, 0x2d, 0x82,
-	0xbb, 0x61, 0x38, 0xe7, 0xdc, 0x33, 0x3f, 0xae, 0x82, 0xd7, 0x80, 0xa3, 0x1c, 0x34, 0x25, 0xbe,
-	0x26, 0x46, 0x5f, 0x38, 0x32, 0x59, 0x4a, 0x2c, 0x7e, 0x6c, 0x04, 0xd9, 0xa0, 0xf8, 0x9a, 0xcc,
-	0x63, 0xbc, 0x86, 0x94, 0x49, 0xc8, 0x3d, 0xb6, 0x7a, 0x46, 0x68, 0xb4, 0x60, 0xb5, 0x47, 0xd3,
-	0xad, 0x38, 0x4d, 0x49, 0x42, 0xc6, 0x2f, 0x62, 0x0c, 0xca, 0x1b, 0xf1, 0x53, 0x95, 0xf3, 0x93,
-	0xf0, 0x99, 0xa2, 0x15, 0xb2, 0x2f, 0x79, 0x8a, 0x95, 0x70, 0xf2, 0xe1, 0xa8, 0xc1, 0x4d, 0x65,
-	0x9d, 0xa3, 0x48, 0x6c, 0xd6, 0x99, 0x7b, 0xa5, 0xf6, 0xea, 0xb4, 0x91, 0x33, 0x76, 0xbc, 0x83,
-	0xe0, 0x04, 0x36, 0x6a, 0x55, 0x51, 0x60, 0x50, 0xa0, 0x36, 0x86, 0x56, 0xee, 0xce, 0x54, 0x27,
-	0xab, 0x53, 0x46, 0xad, 0xb1, 0xe3, 0xf5, 0x82, 0xe9, 0x37, 0xd6, 0xaa, 0x05, 0x2c, 0xf2, 0x14,
-	0x57, 0xf6, 0xd1, 0xb0, 0x31, 0x4e, 0x3e, 0x5b, 0xaa, 0x3f, 0x17, 0xc6, 0x28, 0x99, 0x95, 0x68,
-	0xfe, 0xd0, 0xe7, 0x4e, 0x0d, 0xeb, 0x71, 0xb9, 0xd1, 0xab, 0xed, 0xf5, 0x02, 0x80, 0x9d, 0xa4,
-	0x61, 0x8b, 0x49, 0x38, 0x30, 0x5b, 0x90, 0xce, 0xd5, 0x7e, 0x86, 0xfa, 0x85, 0x63, 0xc9, 0x97,
-	0x05, 0xcf, 0x51, 0x7b, 0xec, 0x78, 0xdd, 0xb0, 0x6f, 0x97, 0xc5, 0x75, 0xee, 0x42, 0x1d, 0x36,
-	0xa2, 0xa6, 0xc0, 0xbf, 0xb2, 0xc0, 0xaf, 0xc1, 0x0c, 0x6d, 0x82, 0xdd, 0x4c, 0x4e, 0x55, 0xef,
-	0x96, 0xe9, 0x3d, 0xaf, 0xf1, 0x0c, 0x55, 0x5b, 0xa2, 0x75, 0x89, 0xa6, 0x1b, 0x16, 0xe3, 0xf5,
-	0x85, 0x3a, 0xd3, 0x94, 0xec, 0xbe, 0xf0, 0xbe, 0x63, 0xa7, 0x87, 0xff, 0xe5, 0x57, 0xb8, 0xfc,
-	0x0a, 0x00, 0x00, 0xff, 0xff, 0xa6, 0xb6, 0x2f, 0xcf, 0xad, 0x02, 0x00, 0x00,
+	// 325 bytes of a gzipped FileDescriptorProto
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x09, 0x6e, 0x88, 0x02, 0xff, 0xa4, 0x92, 0xcf, 0x4a, 0xc3, 0x40,
+	0x10, 0xc6, 0x49, 0x2b, 0xda, 0x6e, 0xab, 0xad, 0x39, 0x95, 0x82, 0x5a, 0x2b, 0x68, 0x2e, 0x4e,
+	0x24, 0x5e, 0x3c, 0xd7, 0xb3, 0x22, 0xa9, 0x17, 0xbd, 0x94, 0x18, 0xc7, 0x10, 0x34, 0xbb, 0x65,
+	0x76, 0xfc, 0x93, 0xa7, 0xf0, 0x09, 0x7c, 0x57, 0x49, 0x36, 0x1b, 0x4a, 0x28, 0x45, 0xf0, 0x36,
+	0x84, 0x6f, 0xbe, 0xfc, 0xe6, 0xc7, 0x0a, 0xf8, 0x08, 0x28, 0xca, 0x21, 0x56, 0x99, 0x1f, 0x2b,
+	0x42, 0x9f, 0x29, 0x92, 0x7a, 0xa9, 0x88, 0xfd, 0x54, 0x32, 0x92, 0x44, 0xf6, 0x63, 0x25, 0x5f,
+	0xd2, 0x04, 0x96, 0xa4, 0x58, 0xb9, 0x07, 0x36, 0x4f, 0x08, 0x75, 0x16, 0x6c, 0x76, 0x7c, 0xd6,
+	0xa8, 0x8b, 0x55, 0x96, 0x29, 0xe9, 0x17, 0x35, 0x12, 0xf9, 0x53, 0xd1, 0xab, 0xe9, 0x19, 0x5f,
+	0xac, 0x0f, 0x6a, 0xa4, 0x34, 0x7a, 0xf3, 0x39, 0x5f, 0xe2, 0xf3, 0x22, 0x43, 0xad, 0xa3, 0x04,
+	0xcd, 0xc6, 0xf4, 0xdb, 0x11, 0x83, 0x5b, 0xd3, 0x31, 0x47, 0xe6, 0x54, 0x26, 0xda, 0xbd, 0x12,
+	0x3b, 0x55, 0xed, 0xc8, 0x99, 0x38, 0xde, 0x5e, 0x70, 0x08, 0x2b, 0x7c, 0xa6, 0x13, 0x24, 0x32,
+	0x54, 0x8b, 0xa1, 0x8d, 0xbb, 0x33, 0xd1, 0xd1, 0x55, 0xcb, 0xa8, 0x35, 0x71, 0xbc, 0x5e, 0x70,
+	0xba, 0x66, 0xd5, 0xe0, 0xc0, 0x7d, 0x81, 0x73, 0x63, 0x68, 0xc2, 0x7a, 0x6f, 0xfa, 0xd3, 0x12,
+	0xfd, 0x39, 0x13, 0x46, 0xd9, 0x75, 0xa9, 0xe8, 0x1f, 0x38, 0x0f, 0x62, 0x58, 0x8d, 0x8b, 0x15,
+	0xac, 0xb6, 0xd7, 0x0b, 0x00, 0x36, 0x1a, 0x87, 0x86, 0x92, 0x70, 0x20, 0x1b, 0x8e, 0x4e, 0xc4,
+	0xae, 0xc6, 0xf8, 0x9d, 0x52, 0xce, 0x17, 0x85, 0xd7, 0x51, 0x7b, 0xe2, 0x78, 0xdd, 0xb0, 0x6f,
+	0x3f, 0x16, 0xc7, 0xb9, 0x73, 0xb1, 0x5f, 0x87, 0x6a, 0x80, 0xad, 0x12, 0xe0, 0xaf, 0x5e, 0x86,
+	0xb6, 0xc0, 0xfe, 0x79, 0x7a, 0x24, 0x7a, 0x77, 0xa4, 0xbe, 0xf2, 0xca, 0xce, 0x50, 0xb4, 0x39,
+	0x4a, 0x4a, 0x33, 0xdd, 0xb0, 0x18, 0x67, 0xe7, 0xe2, 0x38, 0x56, 0xd9, 0xe6, 0x03, 0x1f, 0x3b,
+	0x76, 0x7a, 0xda, 0x2e, 0x1f, 0xc2, 0xe5, 0x6f, 0x00, 0x00, 0x00, 0xff, 0xff, 0x7d, 0x32, 0x45,
+	0x30, 0xb4, 0x02, 0x00, 0x00,
 }

+ 3 - 3
transport/internet/config.proto

@@ -5,14 +5,14 @@ option go_package = "internet";
 option java_package = "com.v2ray.core.transport.internet";
 
 import "v2ray.com/core/common/net/network.proto";
-import "v2ray.com/core/common/loader/type.proto";
+import "v2ray.com/core/common/serial/typed_message.proto";
 
 message NetworkSettings {
   // Type of network that this settings supports.
   v2ray.core.common.net.Network network = 1;
 
   // Specific settings.
-  v2ray.core.common.loader.TypedSettings settings = 2;
+  v2ray.core.common.serial.TypedMessage settings = 2;
 }
 
 message StreamConfig {
@@ -24,7 +24,7 @@ message StreamConfig {
   // Type of security. Must be a message name of the settings proto.
   string security_type = 3;
   
-  repeated v2ray.core.common.loader.TypedSettings security_settings = 4;
+  repeated v2ray.core.common.serial.TypedMessage security_settings = 4;
 }
 
 message ProxyConfig {

+ 4 - 4
transport/internet/header_test.go

@@ -3,7 +3,7 @@ package internet_test
 import (
 	"testing"
 
-	"v2ray.com/core/common/loader"
+	"v2ray.com/core/common/serial"
 	"v2ray.com/core/testing/assert"
 	. "v2ray.com/core/transport/internet"
 	"v2ray.com/core/transport/internet/headers/noop"
@@ -14,15 +14,15 @@ import (
 func TestAllHeadersLoadable(t *testing.T) {
 	assert := assert.On(t)
 
-	noopAuth, err := CreatePacketHeader(loader.GetType(new(noop.Config)), nil)
+	noopAuth, err := CreatePacketHeader(serial.GetMessageType(new(noop.Config)), nil)
 	assert.Error(err).IsNil()
 	assert.Int(noopAuth.Size()).Equals(0)
 
-	srtp, err := CreatePacketHeader(loader.GetType(new(srtp.Config)), nil)
+	srtp, err := CreatePacketHeader(serial.GetMessageType(new(srtp.Config)), nil)
 	assert.Error(err).IsNil()
 	assert.Int(srtp.Size()).Equals(4)
 
-	utp, err := CreatePacketHeader(loader.GetType(new(utp.Config)), nil)
+	utp, err := CreatePacketHeader(serial.GetMessageType(new(utp.Config)), nil)
 	assert.Error(err).IsNil()
 	assert.Int(utp.Size()).Equals(4)
 }

+ 1 - 2
transport/internet/headers/http/http.go

@@ -9,7 +9,6 @@ import (
 	"time"
 
 	"v2ray.com/core/common/buf"
-	"v2ray.com/core/common/loader"
 	"v2ray.com/core/common/serial"
 	"v2ray.com/core/transport/internet"
 )
@@ -255,5 +254,5 @@ func (HttpAuthenticatorFactory) Create(config interface{}) internet.ConnectionAu
 }
 
 func init() {
-	internet.RegisterConnectionAuthenticator(loader.GetType(new(Config)), HttpAuthenticatorFactory{})
+	internet.RegisterConnectionAuthenticator(serial.GetMessageType(new(Config)), HttpAuthenticatorFactory{})
 }

+ 3 - 3
transport/internet/headers/noop/noop.go

@@ -3,7 +3,7 @@ package noop
 import (
 	"net"
 
-	"v2ray.com/core/common/loader"
+	"v2ray.com/core/common/serial"
 	"v2ray.com/core/transport/internet"
 )
 
@@ -39,6 +39,6 @@ func (NoOpConnectionHeaderFactory) Create(config interface{}) internet.Connectio
 }
 
 func init() {
-	internet.RegisterPacketHeader(loader.GetType(new(Config)), NoOpHeaderFactory{})
-	internet.RegisterConnectionAuthenticator(loader.GetType(new(Config)), NoOpConnectionHeaderFactory{})
+	internet.RegisterPacketHeader(serial.GetMessageType(new(Config)), NoOpHeaderFactory{})
+	internet.RegisterConnectionAuthenticator(serial.GetMessageType(new(Config)), NoOpConnectionHeaderFactory{})
 }

+ 1 - 2
transport/internet/headers/srtp/srtp.go

@@ -3,7 +3,6 @@ package srtp
 import (
 	"math/rand"
 
-	"v2ray.com/core/common/loader"
 	"v2ray.com/core/common/serial"
 	"v2ray.com/core/transport/internet"
 )
@@ -35,5 +34,5 @@ func (v SRTPFactory) Create(rawSettings interface{}) internet.PacketHeader {
 }
 
 func init() {
-	internet.RegisterPacketHeader(loader.GetType(new(Config)), SRTPFactory{})
+	internet.RegisterPacketHeader(serial.GetMessageType(new(Config)), SRTPFactory{})
 }

+ 1 - 2
transport/internet/headers/utp/utp.go

@@ -3,7 +3,6 @@ package utp
 import (
 	"math/rand"
 
-	"v2ray.com/core/common/loader"
 	"v2ray.com/core/common/serial"
 	"v2ray.com/core/transport/internet"
 )
@@ -36,5 +35,5 @@ func (v UTPFactory) Create(rawSettings interface{}) internet.PacketHeader {
 }
 
 func init() {
-	internet.RegisterPacketHeader(loader.GetType(new(Config)), UTPFactory{})
+	internet.RegisterPacketHeader(serial.GetMessageType(new(Config)), UTPFactory{})
 }

+ 42 - 42
transport/internet/kcp/config.pb.go

@@ -23,7 +23,7 @@ package kcp
 import proto "github.com/golang/protobuf/proto"
 import fmt "fmt"
 import math "math"
-import v2ray_core_common_loader "v2ray.com/core/common/loader"
+import v2ray_core_common_serial "v2ray.com/core/common/serial"
 
 // Reference imports to suppress errors if they are not otherwise used.
 var _ = proto.Marshal
@@ -106,15 +106,15 @@ func (*ConnectionReuse) ProtoMessage()               {}
 func (*ConnectionReuse) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{6} }
 
 type Config struct {
-	Mtu              *MTU                                    `protobuf:"bytes,1,opt,name=mtu" json:"mtu,omitempty"`
-	Tti              *TTI                                    `protobuf:"bytes,2,opt,name=tti" json:"tti,omitempty"`
-	UplinkCapacity   *UplinkCapacity                         `protobuf:"bytes,3,opt,name=uplink_capacity,json=uplinkCapacity" json:"uplink_capacity,omitempty"`
-	DownlinkCapacity *DownlinkCapacity                       `protobuf:"bytes,4,opt,name=downlink_capacity,json=downlinkCapacity" json:"downlink_capacity,omitempty"`
-	Congestion       bool                                    `protobuf:"varint,5,opt,name=congestion" json:"congestion,omitempty"`
-	WriteBuffer      *WriteBuffer                            `protobuf:"bytes,6,opt,name=write_buffer,json=writeBuffer" json:"write_buffer,omitempty"`
-	ReadBuffer       *ReadBuffer                             `protobuf:"bytes,7,opt,name=read_buffer,json=readBuffer" json:"read_buffer,omitempty"`
-	HeaderConfig     *v2ray_core_common_loader.TypedSettings `protobuf:"bytes,8,opt,name=header_config,json=headerConfig" json:"header_config,omitempty"`
-	ConnectionReuse  *ConnectionReuse                        `protobuf:"bytes,9,opt,name=connection_reuse,json=connectionReuse" json:"connection_reuse,omitempty"`
+	Mtu              *MTU                                   `protobuf:"bytes,1,opt,name=mtu" json:"mtu,omitempty"`
+	Tti              *TTI                                   `protobuf:"bytes,2,opt,name=tti" json:"tti,omitempty"`
+	UplinkCapacity   *UplinkCapacity                        `protobuf:"bytes,3,opt,name=uplink_capacity,json=uplinkCapacity" json:"uplink_capacity,omitempty"`
+	DownlinkCapacity *DownlinkCapacity                      `protobuf:"bytes,4,opt,name=downlink_capacity,json=downlinkCapacity" json:"downlink_capacity,omitempty"`
+	Congestion       bool                                   `protobuf:"varint,5,opt,name=congestion" json:"congestion,omitempty"`
+	WriteBuffer      *WriteBuffer                           `protobuf:"bytes,6,opt,name=write_buffer,json=writeBuffer" json:"write_buffer,omitempty"`
+	ReadBuffer       *ReadBuffer                            `protobuf:"bytes,7,opt,name=read_buffer,json=readBuffer" json:"read_buffer,omitempty"`
+	HeaderConfig     *v2ray_core_common_serial.TypedMessage `protobuf:"bytes,8,opt,name=header_config,json=headerConfig" json:"header_config,omitempty"`
+	ConnectionReuse  *ConnectionReuse                       `protobuf:"bytes,9,opt,name=connection_reuse,json=connectionReuse" json:"connection_reuse,omitempty"`
 }
 
 func (m *Config) Reset()                    { *m = Config{} }
@@ -164,7 +164,7 @@ func (m *Config) GetReadBuffer() *ReadBuffer {
 	return nil
 }
 
-func (m *Config) GetHeaderConfig() *v2ray_core_common_loader.TypedSettings {
+func (m *Config) GetHeaderConfig() *v2ray_core_common_serial.TypedMessage {
 	if m != nil {
 		return m.HeaderConfig
 	}
@@ -192,35 +192,35 @@ func init() {
 func init() { proto.RegisterFile("v2ray.com/core/transport/internet/kcp/config.proto", fileDescriptor0) }
 
 var fileDescriptor0 = []byte{
-	// 473 bytes of a gzipped FileDescriptorProto
-	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x09, 0x6e, 0x88, 0x02, 0xff, 0x8c, 0x93, 0xd1, 0x6f, 0xd3, 0x30,
-	0x10, 0xc6, 0x35, 0xba, 0x96, 0x71, 0xd9, 0xd6, 0x12, 0x21, 0x14, 0x81, 0x84, 0xb6, 0x4a, 0x6c,
-	0xe3, 0x01, 0x47, 0x74, 0x2f, 0xf0, 0xda, 0xf2, 0x32, 0x89, 0x21, 0x30, 0xa9, 0x90, 0x26, 0xa1,
-	0xe2, 0x3a, 0xd7, 0x62, 0xb5, 0xb1, 0x2d, 0xc7, 0x59, 0x55, 0xfe, 0x24, 0xfe, 0x4a, 0x64, 0xa7,
-	0x5d, 0xdb, 0x48, 0xdb, 0xf2, 0x96, 0xf8, 0xbe, 0xfb, 0xd9, 0xfa, 0xee, 0x3b, 0xe8, 0xdd, 0xf6,
-	0x0c, 0x5b, 0x12, 0xae, 0xb2, 0x98, 0x2b, 0x83, 0xb1, 0x35, 0x4c, 0xe6, 0x5a, 0x19, 0x1b, 0x0b,
-	0x69, 0xd1, 0x48, 0xb4, 0xf1, 0x8c, 0xeb, 0x98, 0x2b, 0x39, 0x11, 0x53, 0xa2, 0x8d, 0xb2, 0x2a,
-	0x3c, 0x5d, 0xf7, 0x18, 0x24, 0x77, 0x7a, 0xb2, 0xd6, 0x93, 0x19, 0xd7, 0xaf, 0xce, 0x2b, 0x58,
-	0xae, 0xb2, 0x4c, 0xc9, 0x78, 0xae, 0x58, 0x8a, 0x26, 0xb6, 0x4b, 0x8d, 0x25, 0xab, 0xfb, 0x1a,
-	0x1a, 0xd7, 0xc9, 0x30, 0x7c, 0x01, 0xcd, 0x5b, 0x36, 0x2f, 0x30, 0xda, 0x3b, 0xd9, 0xbb, 0x38,
-	0xa2, 0xe5, 0x8f, 0x2b, 0x26, 0xc9, 0xd5, 0x3d, 0xc5, 0x33, 0x38, 0x1e, 0xea, 0xb9, 0x90, 0xb3,
-	0x01, 0xd3, 0x8c, 0x0b, 0xbb, 0xbc, 0x47, 0x77, 0x01, 0x9d, 0xcf, 0x6a, 0x21, 0x6b, 0x28, 0x4f,
-	0x21, 0xf8, 0x69, 0x84, 0xc5, 0x7e, 0x31, 0x99, 0xa0, 0x09, 0x43, 0xd8, 0xcf, 0xc5, 0xdf, 0xb5,
-	0xc6, 0x7f, 0x77, 0x4f, 0x00, 0x28, 0xb2, 0xf4, 0x01, 0xc5, 0x3b, 0x68, 0x0f, 0x94, 0x94, 0xc8,
-	0xad, 0x50, 0x92, 0x62, 0x91, 0x63, 0xf8, 0x12, 0x5a, 0x28, 0xd9, 0x78, 0x5e, 0x0a, 0x0f, 0xe8,
-	0xea, 0xaf, 0xfb, 0xaf, 0x09, 0xad, 0x81, 0x37, 0x36, 0xfc, 0x08, 0x8d, 0xcc, 0x16, 0xbe, 0x1e,
-	0xf4, 0xce, 0xc8, 0xa3, 0x06, 0x93, 0xeb, 0x64, 0x48, 0x5d, 0x8b, 0xeb, 0xb4, 0x56, 0x44, 0x4f,
-	0x6a, 0x77, 0x26, 0xc9, 0x15, 0x75, 0x2d, 0xe1, 0x0d, 0xb4, 0x0b, 0x6f, 0xe0, 0x88, 0xaf, 0x7c,
-	0x89, 0x1a, 0x9e, 0xf2, 0xa1, 0x06, 0x65, 0xd7, 0x7a, 0x7a, 0x5c, 0xec, 0x8e, 0xe2, 0x37, 0x3c,
-	0x4f, 0x57, 0xa6, 0x6f, 0xe8, 0xfb, 0x9e, 0x7e, 0x59, 0x83, 0x5e, 0x1d, 0x18, 0xed, 0xa4, 0xd5,
-	0x11, 0xbe, 0x01, 0xe0, 0x4a, 0x4e, 0x31, 0x77, 0x3e, 0x47, 0x4d, 0x6f, 0xec, 0xd6, 0x49, 0xf8,
-	0x1d, 0x0e, 0x17, 0x6e, 0x98, 0xa3, 0xb1, 0x9f, 0x55, 0xd4, 0xf2, 0x97, 0x93, 0x1a, 0x97, 0x6f,
-	0x65, 0x80, 0x06, 0x8b, 0xad, 0x40, 0x7c, 0x85, 0xc0, 0x20, 0x4b, 0xd7, 0xc4, 0xa7, 0x9e, 0xf8,
-	0xbe, 0x06, 0x71, 0x13, 0x19, 0x0a, 0x66, 0x13, 0x9f, 0x2f, 0x70, 0xf4, 0x07, 0xdd, 0x42, 0x8c,
-	0xca, 0xf5, 0x8a, 0x0e, 0x3c, 0xf1, 0x7c, 0x9b, 0x58, 0x2e, 0x0e, 0x29, 0x17, 0x87, 0x24, 0x4b,
-	0x8d, 0xe9, 0x0f, 0xb4, 0x56, 0xc8, 0x69, 0x4e, 0x0f, 0xcb, 0xee, 0x55, 0x84, 0x7e, 0x41, 0x87,
-	0xdf, 0x05, 0x6f, 0x64, 0x5c, 0xf2, 0xa2, 0x67, 0x1e, 0xd8, 0xab, 0xf1, 0xc4, 0x4a, 0x66, 0x69,
-	0x9b, 0xef, 0x1e, 0xf4, 0x3f, 0xc1, 0x5b, 0xae, 0xb2, 0xc7, 0x49, 0xfd, 0xa0, 0x7c, 0xcf, 0x37,
-	0xb7, 0xde, 0x37, 0x8d, 0x19, 0xd7, 0xe3, 0x96, 0x5f, 0xf5, 0xcb, 0xff, 0x01, 0x00, 0x00, 0xff,
-	0xff, 0x76, 0x78, 0x1a, 0x9c, 0x6c, 0x04, 0x00, 0x00,
+	// 472 bytes of a gzipped FileDescriptorProto
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x09, 0x6e, 0x88, 0x02, 0xff, 0x8c, 0x53, 0x5d, 0x6f, 0xd3, 0x30,
+	0x14, 0xd5, 0xe8, 0x5a, 0xc6, 0xcd, 0xb6, 0x96, 0x08, 0xa1, 0x08, 0x24, 0xb4, 0x55, 0x62, 0x1a,
+	0x0f, 0x38, 0xd0, 0xbd, 0xc0, 0x6b, 0xcb, 0xcb, 0x84, 0x8a, 0xc0, 0x4a, 0x85, 0x34, 0x09, 0x05,
+	0xd7, 0xb9, 0x2d, 0x56, 0x1b, 0x3b, 0x72, 0x9c, 0x55, 0xe5, 0x1f, 0xf1, 0x2f, 0x91, 0xed, 0x76,
+	0xfd, 0x40, 0x63, 0x79, 0x4b, 0x7c, 0xcf, 0x3d, 0xb6, 0xce, 0x07, 0xf4, 0x6e, 0x7b, 0x9a, 0x2d,
+	0x09, 0x57, 0x79, 0xcc, 0x95, 0xc6, 0xd8, 0x68, 0x26, 0xcb, 0x42, 0x69, 0x13, 0x0b, 0x69, 0x50,
+	0x4b, 0x34, 0xf1, 0x8c, 0x17, 0x31, 0x57, 0x72, 0x22, 0xa6, 0xa4, 0xd0, 0xca, 0xa8, 0xf0, 0x7c,
+	0xbd, 0xa3, 0x91, 0xdc, 0xe1, 0xc9, 0x1a, 0x4f, 0x66, 0xbc, 0x78, 0xf1, 0x6e, 0x8f, 0x96, 0xab,
+	0x3c, 0x57, 0x32, 0x2e, 0x51, 0x0b, 0x36, 0x8f, 0xcd, 0xb2, 0xc0, 0x2c, 0xcd, 0xb1, 0x2c, 0xd9,
+	0x14, 0x3d, 0x69, 0xf7, 0x25, 0x34, 0x86, 0xc9, 0x28, 0x7c, 0x06, 0xcd, 0x5b, 0x36, 0xaf, 0x30,
+	0x3a, 0x38, 0x3b, 0xb8, 0x3c, 0xa1, 0xfe, 0xc7, 0x0e, 0x93, 0xe4, 0xfa, 0x9e, 0xe1, 0x05, 0x9c,
+	0x8e, 0x8a, 0xb9, 0x90, 0xb3, 0x01, 0x2b, 0x18, 0x17, 0x66, 0x79, 0x0f, 0xee, 0x12, 0x3a, 0x9f,
+	0xd4, 0x42, 0xd6, 0x40, 0x9e, 0x43, 0xf0, 0x5d, 0x0b, 0x83, 0xfd, 0x6a, 0x32, 0x41, 0x1d, 0x86,
+	0x70, 0x58, 0x8a, 0xdf, 0x6b, 0x8c, 0xfb, 0xee, 0x9e, 0x01, 0x50, 0x64, 0xd9, 0x7f, 0x10, 0x6f,
+	0xa0, 0x3d, 0x50, 0x52, 0x22, 0x37, 0x42, 0x49, 0x8a, 0x55, 0x89, 0xe1, 0x73, 0x68, 0xa1, 0x64,
+	0xe3, 0xb9, 0x07, 0x1e, 0xd1, 0xd5, 0x5f, 0xf7, 0x4f, 0x13, 0x5a, 0x03, 0xa7, 0x70, 0xf8, 0x01,
+	0x1a, 0xb9, 0xa9, 0xdc, 0x3c, 0xe8, 0x5d, 0x90, 0x07, 0x95, 0x26, 0xc3, 0x64, 0x44, 0xed, 0x8a,
+	0xdd, 0x34, 0x46, 0x44, 0x8f, 0x6a, 0x6f, 0x26, 0xc9, 0x35, 0xb5, 0x2b, 0xe1, 0x0d, 0xb4, 0x2b,
+	0x27, 0x60, 0xca, 0x57, 0xba, 0x44, 0x0d, 0xc7, 0xf2, 0xbe, 0x06, 0xcb, 0xae, 0xf4, 0xf4, 0xb4,
+	0xda, 0xb5, 0xe2, 0x27, 0x3c, 0xcd, 0x56, 0xa2, 0x6f, 0xd8, 0x0f, 0x1d, 0xfb, 0x55, 0x0d, 0xf6,
+	0x7d, 0xc3, 0x68, 0x27, 0xdb, 0xb7, 0xf0, 0x15, 0x00, 0x57, 0x72, 0x8a, 0xa5, 0xd5, 0x39, 0x6a,
+	0x3a, 0x61, 0xb7, 0x4e, 0xc2, 0x6f, 0x70, 0xbc, 0xb0, 0x66, 0xa6, 0x63, 0xe7, 0x55, 0xd4, 0x72,
+	0x97, 0x93, 0x1a, 0x97, 0x6f, 0x65, 0x80, 0x06, 0x8b, 0xad, 0x40, 0x7c, 0x81, 0x40, 0x23, 0xcb,
+	0xd6, 0x8c, 0x8f, 0x1d, 0xe3, 0xdb, 0x1a, 0x8c, 0x9b, 0xc8, 0x50, 0xd0, 0x9b, 0xf8, 0x7c, 0x86,
+	0x93, 0x5f, 0xc8, 0x32, 0xd4, 0xa9, 0xef, 0x59, 0x74, 0xf4, 0xaf, 0x89, 0xbe, 0x41, 0xc4, 0x37,
+	0x88, 0x24, 0xb6, 0x41, 0x43, 0x5f, 0x20, 0x7a, 0xec, 0x97, 0x57, 0x09, 0xfa, 0x01, 0x1d, 0x7e,
+	0x97, 0xbb, 0x54, 0xdb, 0xe0, 0x45, 0x4f, 0x1c, 0x5f, 0xaf, 0xc6, 0x0b, 0xf7, 0x22, 0x4b, 0xdb,
+	0x7c, 0xf7, 0xa0, 0xff, 0x11, 0x5e, 0x73, 0x95, 0x3f, 0xcc, 0xd4, 0x0f, 0xfc, 0x7b, 0xbe, 0xda,
+	0x76, 0xdf, 0x34, 0x66, 0xbc, 0x18, 0xb7, 0x5c, 0xd3, 0xaf, 0xfe, 0x06, 0x00, 0x00, 0xff, 0xff,
+	0xc4, 0x62, 0x24, 0xb7, 0x74, 0x04, 0x00, 0x00,
 }

+ 2 - 2
transport/internet/kcp/config.proto

@@ -5,7 +5,7 @@ option go_package = "kcp";
 option java_package = "com.v2ray.core.transport.internet.kcp";
 option java_outer_classname = "ConfigProto";
 
-import "v2ray.com/core/common/loader/type.proto";
+import "v2ray.com/core/common/serial/typed_message.proto";
 
 // Maximum Transmission Unit, in bytes.
 message MTU {
@@ -49,6 +49,6 @@ message Config {
   bool congestion = 5;
   WriteBuffer write_buffer = 6;
   ReadBuffer read_buffer = 7;
-  v2ray.core.common.loader.TypedSettings header_config = 8;
+  v2ray.core.common.serial.TypedMessage header_config = 8;
   ConnectionReuse connection_reuse = 9;
 }

+ 3 - 3
transport/internet/kcp/kcp_test.go

@@ -8,8 +8,8 @@ import (
 	"testing"
 	"time"
 
-	"v2ray.com/core/common/loader"
 	v2net "v2ray.com/core/common/net"
+	"v2ray.com/core/common/serial"
 	"v2ray.com/core/testing/assert"
 	"v2ray.com/core/transport/internet"
 	. "v2ray.com/core/transport/internet/kcp"
@@ -24,7 +24,7 @@ func TestDialAndListen(t *testing.T) {
 			NetworkSettings: []*internet.NetworkSettings{
 				{
 					Network:  v2net.Network_KCP,
-					Settings: loader.NewTypedSettings(&Config{}),
+					Settings: serial.ToTypedMessage(&Config{}),
 				},
 			},
 		},
@@ -63,7 +63,7 @@ func TestDialAndListen(t *testing.T) {
 				NetworkSettings: []*internet.NetworkSettings{
 					{
 						Network:  v2net.Network_KCP,
-						Settings: loader.NewTypedSettings(&Config{}),
+						Settings: serial.ToTypedMessage(&Config{}),
 					},
 				},
 			},

+ 22 - 21
transport/internet/tcp/config.pb.go

@@ -17,7 +17,7 @@ package tcp
 import proto "github.com/golang/protobuf/proto"
 import fmt "fmt"
 import math "math"
-import v2ray_core_common_loader "v2ray.com/core/common/loader"
+import v2ray_core_common_serial "v2ray.com/core/common/serial"
 
 // Reference imports to suppress errors if they are not otherwise used.
 var _ = proto.Marshal
@@ -40,8 +40,8 @@ func (*ConnectionReuse) ProtoMessage()               {}
 func (*ConnectionReuse) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{0} }
 
 type Config struct {
-	ConnectionReuse *ConnectionReuse                        `protobuf:"bytes,1,opt,name=connection_reuse,json=connectionReuse" json:"connection_reuse,omitempty"`
-	HeaderSettings  *v2ray_core_common_loader.TypedSettings `protobuf:"bytes,2,opt,name=header_settings,json=headerSettings" json:"header_settings,omitempty"`
+	ConnectionReuse *ConnectionReuse                       `protobuf:"bytes,1,opt,name=connection_reuse,json=connectionReuse" json:"connection_reuse,omitempty"`
+	HeaderSettings  *v2ray_core_common_serial.TypedMessage `protobuf:"bytes,2,opt,name=header_settings,json=headerSettings" json:"header_settings,omitempty"`
 }
 
 func (m *Config) Reset()                    { *m = Config{} }
@@ -56,7 +56,7 @@ func (m *Config) GetConnectionReuse() *ConnectionReuse {
 	return nil
 }
 
-func (m *Config) GetHeaderSettings() *v2ray_core_common_loader.TypedSettings {
+func (m *Config) GetHeaderSettings() *v2ray_core_common_serial.TypedMessage {
 	if m != nil {
 		return m.HeaderSettings
 	}
@@ -71,21 +71,22 @@ func init() {
 func init() { proto.RegisterFile("v2ray.com/core/transport/internet/tcp/config.proto", fileDescriptor0) }
 
 var fileDescriptor0 = []byte{
-	// 249 bytes of a gzipped FileDescriptorProto
-	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x09, 0x6e, 0x88, 0x02, 0xff, 0x84, 0x90, 0xc1, 0x4a, 0xc3, 0x60,
-	0x10, 0x84, 0x89, 0x42, 0x90, 0xbf, 0x60, 0x24, 0x07, 0x29, 0x9e, 0xb4, 0x20, 0xd5, 0xcb, 0xfe,
-	0x10, 0x4f, 0x5e, 0xdb, 0x17, 0x28, 0xd1, 0x93, 0x20, 0x25, 0xdd, 0xae, 0x35, 0xd0, 0xec, 0xfe,
-	0x6c, 0x56, 0x21, 0x8f, 0xe6, 0xdb, 0x49, 0x92, 0xa6, 0x94, 0x5c, 0x7a, 0x5c, 0x98, 0x99, 0xfd,
-	0x66, 0x5c, 0xf6, 0x9b, 0x69, 0xd1, 0x00, 0x4a, 0xe5, 0x51, 0x94, 0xbc, 0x69, 0xc1, 0x75, 0x10,
-	0x35, 0x5f, 0xb2, 0x91, 0x32, 0x99, 0x37, 0x0c, 0x1e, 0x85, 0xbf, 0xca, 0x1d, 0x04, 0x15, 0x93,
-	0xf4, 0x61, 0xf0, 0x28, 0xc1, 0x51, 0x0f, 0x83, 0x1e, 0x0c, 0xc3, 0xdd, 0x7c, 0x14, 0x8b, 0x52,
-	0x55, 0xc2, 0x7e, 0x2f, 0xc5, 0x96, 0xd4, 0x5b, 0x13, 0xa8, 0xcf, 0x9a, 0x3d, 0xbb, 0x64, 0x29,
-	0xcc, 0x84, 0x56, 0x0a, 0xe7, 0xf4, 0x53, 0x53, 0x7a, 0xeb, 0x62, 0xe2, 0x62, 0xb3, 0xa7, 0x69,
-	0x74, 0x1f, 0x3d, 0x5d, 0xe5, 0x87, 0x6b, 0xf6, 0x17, 0xb9, 0x78, 0xd9, 0x71, 0xa4, 0x9f, 0xee,
-	0x06, 0x8f, 0xae, 0xb5, 0xb6, 0xb6, 0x4e, 0x3c, 0xc9, 0x32, 0x38, 0x0b, 0x07, 0xa3, 0x87, 0x79,
-	0x82, 0x23, 0x82, 0x95, 0x4b, 0xbe, 0xa9, 0x25, 0x5d, 0xd7, 0x64, 0x56, 0xf2, 0xae, 0x9e, 0x5e,
-	0x74, 0xe9, 0xf3, 0xd3, 0xf4, 0xbe, 0x13, 0xf4, 0x9d, 0xe0, 0xbd, 0x09, 0xb4, 0x7d, 0x3b, 0xc8,
-	0xf3, 0xeb, 0xde, 0x3f, 0xdc, 0x8b, 0x57, 0xf7, 0x88, 0x52, 0x9d, 0x67, 0x5b, 0x4c, 0xfa, 0x86,
-	0xab, 0x76, 0x9c, 0x8f, 0x4b, 0xc3, 0xb0, 0x89, 0xbb, 0xa1, 0x5e, 0xfe, 0x03, 0x00, 0x00, 0xff,
-	0xff, 0xdf, 0xaf, 0x5e, 0x9f, 0xaa, 0x01, 0x00, 0x00,
+	// 257 bytes of a gzipped FileDescriptorProto
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x09, 0x6e, 0x88, 0x02, 0xff, 0x84, 0x90, 0x41, 0x4b, 0xc3, 0x40,
+	0x10, 0x85, 0x89, 0x42, 0x90, 0x2d, 0x18, 0xc9, 0x41, 0x8a, 0x27, 0x2d, 0x28, 0x7a, 0xd9, 0x95,
+	0x78, 0xf2, 0xda, 0x9e, 0x45, 0x89, 0x9e, 0x04, 0x09, 0xdb, 0xe9, 0x18, 0x03, 0xdd, 0x9d, 0x65,
+	0x76, 0x14, 0xfa, 0xcf, 0xfc, 0x79, 0x92, 0x6c, 0x5b, 0x24, 0x97, 0x1e, 0x17, 0xde, 0xf7, 0xf6,
+	0x7d, 0xa3, 0xaa, 0x9f, 0x8a, 0xed, 0x46, 0x03, 0x39, 0x03, 0xc4, 0x68, 0x84, 0xad, 0x8f, 0x81,
+	0x58, 0x4c, 0xe7, 0x05, 0xd9, 0xa3, 0x18, 0x81, 0x60, 0x80, 0xfc, 0x67, 0xd7, 0xea, 0xc0, 0x24,
+	0x54, 0x5e, 0xed, 0x18, 0x46, 0xbd, 0xcf, 0xeb, 0x5d, 0x5e, 0x0b, 0x84, 0x8b, 0xfb, 0x51, 0x2d,
+	0x90, 0x73, 0xe4, 0x4d, 0x44, 0xee, 0xec, 0xda, 0xc8, 0x26, 0xe0, 0xaa, 0x71, 0x18, 0xa3, 0x6d,
+	0x31, 0x95, 0xce, 0xee, 0x54, 0xb1, 0x20, 0xef, 0x11, 0xa4, 0x23, 0x5f, 0xe3, 0x77, 0xc4, 0xf2,
+	0x5c, 0xe5, 0xe8, 0xed, 0x72, 0x8d, 0xd3, 0xec, 0x32, 0xbb, 0x3d, 0xa9, 0xb7, 0xaf, 0xd9, 0x6f,
+	0xa6, 0xf2, 0xc5, 0x30, 0xa8, 0xfc, 0x50, 0x67, 0xb0, 0xa7, 0x1a, 0xee, 0xb1, 0x21, 0x3c, 0xa9,
+	0x2a, 0x7d, 0x70, 0xa5, 0x1e, 0x7d, 0x58, 0x17, 0x30, 0x5a, 0xf0, 0xac, 0x8a, 0x2f, 0xb4, 0x2b,
+	0xe4, 0x26, 0xa2, 0x48, 0xe7, 0xdb, 0x38, 0x3d, 0x1a, 0xda, 0x6f, 0xfe, 0xb7, 0x27, 0x39, 0x9d,
+	0xe4, 0xf4, 0x5b, 0x2f, 0xf7, 0x94, 0xdc, 0xea, 0xd3, 0x84, 0xbf, 0x6e, 0xe9, 0xf9, 0xa3, 0xba,
+	0x06, 0x72, 0x87, 0xa7, 0xcd, 0x27, 0x49, 0xf0, 0xa5, 0xbf, 0xcd, 0xfb, 0xb1, 0x40, 0x58, 0xe6,
+	0xc3, 0x9d, 0x1e, 0xfe, 0x02, 0x00, 0x00, 0xff, 0xff, 0x15, 0x9d, 0x12, 0x13, 0xb2, 0x01, 0x00,
+	0x00,
 }

+ 2 - 2
transport/internet/tcp/config.proto

@@ -5,12 +5,12 @@ option go_package = "tcp";
 option java_package = "com.v2ray.core.transport.internet.tcp";
 option java_outer_classname = "ConfigProto";
 
-import "v2ray.com/core/common/loader/type.proto";
+import "v2ray.com/core/common/serial/typed_message.proto";
 
 message ConnectionReuse {
   bool enable = 1;
 }
 message Config {
   ConnectionReuse connection_reuse = 1;
-  v2ray.core.common.loader.TypedSettings header_settings = 2;
+  v2ray.core.common.serial.TypedMessage header_settings = 2;
 }

+ 11 - 11
transport/internet/ws/ws_test.go

@@ -5,8 +5,8 @@ import (
 	"testing"
 	"time"
 
-	"v2ray.com/core/common/loader"
 	v2net "v2ray.com/core/common/net"
+	"v2ray.com/core/common/serial"
 	"v2ray.com/core/testing/assert"
 	"v2ray.com/core/transport/internet"
 	v2tls "v2ray.com/core/transport/internet/tls"
@@ -21,7 +21,7 @@ func Test_listenWSAndDial(t *testing.T) {
 			NetworkSettings: []*internet.NetworkSettings{
 				{
 					Network: v2net.Network_WebSocket,
-					Settings: loader.NewTypedSettings(&Config{
+					Settings: serial.ToTypedMessage(&Config{
 						Path: "ws",
 					}),
 				},
@@ -47,7 +47,7 @@ func Test_listenWSAndDial(t *testing.T) {
 			NetworkSettings: []*internet.NetworkSettings{
 				{
 					Network: v2net.Network_WebSocket,
-					Settings: loader.NewTypedSettings(&Config{
+					Settings: serial.ToTypedMessage(&Config{
 						Path: "ws",
 					}),
 				},
@@ -63,7 +63,7 @@ func Test_listenWSAndDial(t *testing.T) {
 			NetworkSettings: []*internet.NetworkSettings{
 				{
 					Network: v2net.Network_WebSocket,
-					Settings: loader.NewTypedSettings(&Config{
+					Settings: serial.ToTypedMessage(&Config{
 						Path: "ws",
 					}),
 				},
@@ -79,7 +79,7 @@ func Test_listenWSAndDial(t *testing.T) {
 			NetworkSettings: []*internet.NetworkSettings{
 				{
 					Network: v2net.Network_WebSocket,
-					Settings: loader.NewTypedSettings(&Config{
+					Settings: serial.ToTypedMessage(&Config{
 						Path: "ws",
 					}),
 				},
@@ -108,13 +108,13 @@ func Test_listenWSAndDial_TLS(t *testing.T) {
 
 	listen, err := ListenWS(v2net.DomainAddress("localhost"), 13143, internet.ListenOptions{
 		Stream: &internet.StreamConfig{
-			SecurityType:     loader.GetType(new(v2tls.Config)),
-			SecuritySettings: []*loader.TypedSettings{loader.NewTypedSettings(tlsSettings)},
+			SecurityType:     serial.GetMessageType(new(v2tls.Config)),
+			SecuritySettings: []*serial.TypedMessage{serial.ToTypedMessage(tlsSettings)},
 			Network:          v2net.Network_WebSocket,
 			NetworkSettings: []*internet.NetworkSettings{
 				{
 					Network: v2net.Network_WebSocket,
-					Settings: loader.NewTypedSettings(&Config{
+					Settings: serial.ToTypedMessage(&Config{
 						Path: "wss",
 						ConnectionReuse: &ConnectionReuse{
 							Enable: true,
@@ -133,13 +133,13 @@ func Test_listenWSAndDial_TLS(t *testing.T) {
 	}()
 	conn, err := Dial(v2net.AnyIP, v2net.TCPDestination(v2net.DomainAddress("localhost"), 13143), internet.DialerOptions{
 		Stream: &internet.StreamConfig{
-			SecurityType:     loader.GetType(new(v2tls.Config)),
-			SecuritySettings: []*loader.TypedSettings{loader.NewTypedSettings(tlsSettings)},
+			SecurityType:     serial.GetMessageType(new(v2tls.Config)),
+			SecuritySettings: []*serial.TypedMessage{serial.ToTypedMessage(tlsSettings)},
 			Network:          v2net.Network_WebSocket,
 			NetworkSettings: []*internet.NetworkSettings{
 				{
 					Network: v2net.Network_WebSocket,
-					Settings: loader.NewTypedSettings(&Config{
+					Settings: serial.ToTypedMessage(&Config{
 						Path: "wss",
 						ConnectionReuse: &ConnectionReuse{
 							Enable: true,