# Class MessageContent`Abstract`

消息体基类

# 自定义消息示例代码

    import { JsonConverter, MessageContent, MessageFlag, MessageTag } from '@rongcloud/imlib';
    import List from '@ohos.util.List';

    const CustomOrderMessageObjectName = "App:OrderMsg";
    const CustomOrderMessageFlag = MessageFlag.Count;

    // 1. 继承 MessageContent 并实现 MessageTag 注解
    &#64MessageTag(CustomOrderMessageObjectName,CustomOrderMessageFlag)
    class CustomOrderMessage extends MessageContent {
      // 2. 按需增加属性
      id: string = ""; // 订单 ID
      name: string = ""; // 订单名称
      price: number = 0; // 订单价格

      // 3. 必须声明无参的构造方法，因为注册自定义消息时候，只能用无参构造方法
      constructor() {
        super();
      }

      // 4. 将消息对象转为 JSON 字符串
      encode(): string {
        // 4.1 将基类的数据保存到 map 中
        let map = super.encodeBaseData();

        // 4.2 将本类的独有属性放到 map 中
        // 说明：ts 的 map 必须指定 kv 的类型，所以存多种类型数据，需要转为 Object
        if (this.id) {
          map.set("id", this.id as Object);
        }
        if (this.name) {
          map.set("name", this.name as Object);
        }
        map.set("price", this.price as Object);

        // 4.3 将 map 转为 字符串
        return JsonConverter.stringifyFromHashMap(map);
      }

      // 5. 将字符串转为消息对象
      decode(contentJson: string): void {
        // 5.1 将字符串转为 map
        let map = JsonConverter.parseToHashMap(contentJson);
        // 5.2 将基类的数据解析出来
        super.decodeBaseData(map);

        // 5.3 将本类的独有属性解析
        // 说明：需要将 Object 转为对应的数据类型
        if (map.get("id")) {
          this.id = map.get("id") as string;
        }
        if (map.get("name")) {
          this.name = map.get("name") as string;
        }
        if (map.get("price")) {
          this.price = map.get("price") as number;
        }
      }

      // 6. 将当前类名返回：该方法的作用是防止代码混淆或者压缩后无法获取正常的类名
      // 直接写字符串可能会出现拼写错误的情况，所以此处建议直接使用 类名.name
      getClassName(): string {
        return CustomOrderMessage.name;
      }

      // 7. 返回搜索字段
      // 1) 不实现该方法，该类消息无法被搜索
      // 2) 实现该方法，返回 null 或者 List 长度为 0，无法被搜索
      // 3) 实现该方法， List 里面的 空字符串 和 null 会被忽略
      // 4) List 中必须包含有效的字符串才能被搜索到
      getSearchableWord(): List<string> | null {
       if (!this.name) {
         return null;
       }
       let list = new List<string>();
       list.add(this.name);
       return list;
      }
    }

    export { CustomOrderMessage, CustomOrderMessageObjectName }

#### Version

1.0.0

#### Hierarchy (View Summary)

- MessageContent
  - MediaMessageContent
  - CommandMessage
  - CommandNotificationMessage
  - InformationNotificationMessage
  - LocationMessage
  - ReadReceiptMessage
  - RecallNotificationMessage
  - ReferenceMessage
  - RichContentMessage
  - TextMessage
  - UnknownMessage
  - VoiceMessage

- Defined in message/content/MessageContent.ts:115

##### Index

### Constructors

constructor

### Properties

extra?
userInfo?
mentionedInfo?
rawString?
destructDuration?

### Methods

encode
decode
getClassName
getSearchableWord
encodeBaseData
decodeBaseData

## Constructors

### constructor

- new MessageContent(): MessageContent

  #### Returns MessageContent

## Properties

### `Optional` extra

extra?: string

消息的附加信息，会随着消息发送出去

#### See

Message.extra

- Defined in message/content/MessageContent.ts:120

### `Optional` userInfo

userInfo?: UserInfo

消息携带的用户信息

- Defined in message/content/MessageContent.ts:124

### `Optional` mentionedInfo

mentionedInfo?: MentionedInfo

消息的 @ 信息

- Defined in message/content/MessageContent.ts:128

### `Optional` rawString

rawString?: string

消息的原始内容

SDK 执行消息的 decode 方法正常时，会将数据解析到消息的各个字段，rawString 将会为空

如果 decode 方法异常时会将消息的原始数据保存在 rawString 中

- Defined in message/content/MessageContent.ts:137

### `Optional` destructDuration

destructDuration?: number

阅后即焚时长，单位秒

    destructDuration <= 0 代表是普通消息
    destructDuration > 0 代表是阅后即焚消息，该消息已读后，经过 destructDuration 时间后销毁

#### Version

1.3.0

- Defined in message/content/MessageContent.ts:147

## Methods

### `Abstract` encode

- encode(): string

  编码方法，将消息对象转为 string

  #### Returns string

  - Defined in message/content/MessageContent.ts:153

### `Abstract` decode

- decode(contentString: string): void

  解码方法，将 string 数据解析到消息的各个字段

  #### Parameters

  - contentString: string

  #### Returns void

  - Defined in message/content/MessageContent.ts:159

### `Abstract` getClassName

- getClassName(): string

  返回消息体类名。直接写字符串可能会出现拼写错误的情况，所以此处建议直接使用 类名.name

      该方法的作用是保证代码处于混淆的状态依旧可以获取正常的类名
      类名通过 .name 属性访问，通常不会受到代码混淆或压缩的影响，因为这个属性是在编译阶段就确定的，是对 TypeScript 类型系统的一种反射
      对象.constructor.name 在没有代码混淆或压缩的情况下，它通常会返回构造函数的原始名称。然而，在代码混淆或压缩后，构造函数名可能会被改变或简化，这取决于混淆或压缩器的实现
      如果此方法返回的不是对应的类名，将不会正常执行对应消息类的 encode() 方法

  #### Returns string

  该消息体类名

  - Defined in message/content/MessageContent.ts:171

### getSearchableWord

- getSearchableWord(): any

  返回消息体内的可搜索内容

      如果消息包含多个字段,可将每个字段填充到 List 中; 比如图文消息的 title 和 summary。

      SDK 内置消息已支持搜索，自定义消息需要实现该方法
      1) 不实现该方法，该类消息无法被搜索
      2) 实现该方法，返回 null 或者 List 长度为 0，无法被搜索
      3) 实现该方法， List 里面的 空字符串 和 null 会被忽略
      4) List 中必须包含有效的字符串才能被搜索到

  #### Returns any

  可搜索的内容

  #### Version

  1.1.0

  - Defined in message/content/MessageContent.ts:187

### encodeBaseData

- encodeBaseData(): HashMap<string, Object>

  将基类的基础数据保存到 map 中

  #### Returns HashMap<string, Object>

  - Defined in message/content/MessageContent.ts:195

### decodeBaseData

- decodeBaseData(map: HashMap<string, Object>): void

  将基类的基础数据从 map 中解析出来

  #### Parameters

  - map: HashMap<string, Object>

  #### Returns void

  - Defined in message/content/MessageContent.ts:216