Compare commits
96 Commits
init-folde
...
main
Author | SHA1 | Date | |
---|---|---|---|
1e51dc8fe5 | |||
18d4f2d5c8 | |||
1a9f0cf8f8 | |||
f8e3672c04 | |||
861f0d83db | |||
ae40affffc | |||
c025706576 | |||
54236a80c3 | |||
26be54f7ac | |||
601c371a37 | |||
93f95dc3f6 | |||
29b443875e | |||
e3f7a39334 | |||
e55c220b91 | |||
513c4db6ba | |||
12b0dc1089 | |||
cc157a31c5 | |||
17f6fb0199 | |||
264ec78c00 | |||
44a2d4a16c | |||
409f767b75 | |||
addd1ae94c | |||
8847b70e82 | |||
b24df2ef3f | |||
8a59be936d | |||
054dc82f0a | |||
3549c06ce7 | |||
ed746fce2b | |||
04268f7d75 | |||
0cb1080067 | |||
f52cf84cc2 | |||
5db82c2493 | |||
45e72bdc72 | |||
311971ff70 | |||
|
c6c470f069 | ||
ac813f6722 | |||
66c3b97650 | |||
186401fe22 | |||
d5ee93f952 | |||
3aaa98b247 | |||
e93531c52c | |||
45534e0b17 | |||
d417c42553 | |||
0985a88859 | |||
617692cf6b | |||
0792e3448f | |||
bd5bd59e5b | |||
8298582ef3 | |||
228d426364 | |||
93d2ebbbe1 | |||
a6c5ba2594 | |||
e92ddde554 | |||
6671163b02 | |||
22a9c9e329 | |||
|
97750b76b1 | ||
|
a0549cc87f | ||
|
0cd1993c85 | ||
|
879b754cef | ||
|
a95a124a46 | ||
|
b193099ebc | ||
|
7ef0580560 | ||
|
f7f0c049f2 | ||
|
d9739146f3 | ||
|
3e83e6d7f8 | ||
|
2a794ea441 | ||
|
7602bdef62 | ||
|
72c4c91e5d | ||
|
aa5a0db7f6 | ||
|
05629f46e0 | ||
|
94189f572c | ||
|
61b3f40793 | ||
|
10e01554cd | ||
|
9aa572b63e | ||
|
fbe4824ea5 | ||
|
02dfa8fc58 | ||
|
13067122c7 | ||
|
25f039d237 | ||
|
34c6c5ba85 | ||
|
e976c34ac9 | ||
|
1543c67894 | ||
|
b84cd2d94b | ||
|
0a895131cd | ||
|
a869f1dded | ||
|
cd27777ee3 | ||
|
5feb925873 | ||
|
be9c5d5294 | ||
|
5bb7b86a3d | ||
|
eeb5532bff | ||
|
9e29cf14bb | ||
|
c3819a69e3 | ||
|
10c4b99e54 | ||
|
f9f812d1e3 | ||
|
7c920fa887 | ||
|
f191fd47ae | ||
|
4ebc3891d9 | ||
|
f1e652bcce |
8
.idea/.gitignore
generated
vendored
8
.idea/.gitignore
generated
vendored
@ -1,8 +0,0 @@
|
|||||||
# Default ignored files
|
|
||||||
/shelf/
|
|
||||||
/workspace.xml
|
|
||||||
# Datasource local storage ignored files
|
|
||||||
/../../../../../../:\WorkDir\GitHub\cwiki-us-docs\cwikius-docs\.idea/dataSources/
|
|
||||||
/dataSources.local.xml
|
|
||||||
# Editor-based HTTP Client requests
|
|
||||||
/httpRequests/
|
|
25
.idea/codeStyles/Project.xml
generated
25
.idea/codeStyles/Project.xml
generated
@ -1,25 +0,0 @@
|
|||||||
<component name="ProjectCodeStyleConfiguration">
|
|
||||||
<code_scheme name="Project" version="173">
|
|
||||||
<JetCodeStyleSettings>
|
|
||||||
<option name="PACKAGES_TO_USE_STAR_IMPORTS">
|
|
||||||
<value>
|
|
||||||
<package name="java.util" alias="false" withSubpackages="false" />
|
|
||||||
<package name="kotlinx.android.synthetic" alias="false" withSubpackages="true" />
|
|
||||||
<package name="io.ktor" alias="false" withSubpackages="true" />
|
|
||||||
</value>
|
|
||||||
</option>
|
|
||||||
<option name="PACKAGES_IMPORT_LAYOUT">
|
|
||||||
<value>
|
|
||||||
<package name="" alias="false" withSubpackages="true" />
|
|
||||||
<package name="java" alias="false" withSubpackages="true" />
|
|
||||||
<package name="javax" alias="false" withSubpackages="true" />
|
|
||||||
<package name="kotlin" alias="false" withSubpackages="true" />
|
|
||||||
<package name="" alias="true" withSubpackages="true" />
|
|
||||||
</value>
|
|
||||||
</option>
|
|
||||||
</JetCodeStyleSettings>
|
|
||||||
<ScalaCodeStyleSettings>
|
|
||||||
<option name="MULTILINE_STRING_CLOSING_QUOTES_ON_NEW_LINE" value="true" />
|
|
||||||
</ScalaCodeStyleSettings>
|
|
||||||
</code_scheme>
|
|
||||||
</component>
|
|
5
.idea/codeStyles/codeStyleConfig.xml
generated
5
.idea/codeStyles/codeStyleConfig.xml
generated
@ -1,5 +0,0 @@
|
|||||||
<component name="ProjectCodeStyleConfiguration">
|
|
||||||
<state>
|
|
||||||
<option name="PREFERRED_PROJECT_CODE_STYLE" value="Default" />
|
|
||||||
</state>
|
|
||||||
</component>
|
|
6
.idea/thriftCompiler.xml
generated
Normal file
6
.idea/thriftCompiler.xml
generated
Normal file
@ -0,0 +1,6 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<project version="4">
|
||||||
|
<component name="ThriftCompiler">
|
||||||
|
<compilers />
|
||||||
|
</component>
|
||||||
|
</project>
|
33
CONTACT.md
33
CONTACT.md
@ -1,11 +1,40 @@
|
|||||||
|
# 联系方式
|
||||||
|
|
||||||
|
请使用下面的联系方式和我们联系:
|
||||||
|
|
||||||
|
| 联系方式名称 | 联系方式 |
|
||||||
|
|--------|-----------------------------------------------|
|
||||||
|
| 电子邮件 | [service@ossez.com](mailto:service@ossez.com) |
|
||||||
|
| QQ 或微信 | 103899765 |
|
||||||
|
| 社区论坛 | https://www.ossez.com/c/open-source/java/15 |
|
||||||
|
|
||||||
# 公众平台
|
# 公众平台
|
||||||
|
|
||||||
我们建议您通过社区论坛来和我们进行沟通,请关注我们公众平台上的账号
|
我们建议您通过社区论坛来和我们进行沟通,请关注我们公众平台上的账号。
|
||||||
|
|
||||||
|
扫描 QR 关注我们的微信公众号和头条号。
|
||||||
|
|
||||||
## 微信公众号
|
## 微信公众号
|
||||||
|
|
||||||

|

|
||||||
|
|
||||||
## 头条号
|
## 头条号
|
||||||
我们也在头条号上创建了我们的公众号,请扫描下面的 QR 关注我们的头条号。
|
|
||||||
|
|
||||||

|

|
||||||
|
|
||||||
|
## 知乎
|
||||||
|
|
||||||
|
请关注我们的知乎:https://www.zhihu.com/people/huyuchengus
|
||||||
|
|
||||||
|
## 快速导航
|
||||||
|
|
||||||
|
在下面的表格中,我们列出了一些比较有用的 CWIKIUS 相关软件开发使用教程的导航,欢迎访问下面的链接获得更多的内容和参与讨论
|
||||||
|
|
||||||
|
| 网站名称 | URL | NOTE |
|
||||||
|
|----------------|--------------------------------------------------------|----------------------------|
|
||||||
|
| OSSEZ 社区 | [www.ossez.com](https://www.ossez.com/) | 开放社区,欢迎注册参与讨论 |
|
||||||
|
| WIKI 维基 | [www.cwiki.us](https://www.cwiki.us/) | 使用 Confluence 部署的 WIKI 知识库 |
|
||||||
|
| DOCS.OSSEZ.COM | [https://docs.ossez.com/#/](https://docs.ossez.com/#/) | 本手册的编译版本将会部署在这个链接上 |
|
||||||
|
| CN 博客 | [http://www.cwikius.cn/](http://www.cwikius.cn/) | CWIKIUS.CN 一个有独立思考和温度的清新站 |
|
||||||
|
|
||||||
|
##
|
21
LICENSE
Normal file
21
LICENSE
Normal file
@ -0,0 +1,21 @@
|
|||||||
|
MIT License
|
||||||
|
|
||||||
|
Copyright (c) 2022 OSSEZ.COM
|
||||||
|
|
||||||
|
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||||
|
of this software and associated documentation files (the "Software"), to deal
|
||||||
|
in the Software without restriction, including without limitation the rights
|
||||||
|
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||||
|
copies of the Software, and to permit persons to whom the Software is
|
||||||
|
furnished to do so, subject to the following conditions:
|
||||||
|
|
||||||
|
The above copyright notice and this permission notice shall be included in all
|
||||||
|
copies or substantial portions of the Software.
|
||||||
|
|
||||||
|
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||||
|
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||||
|
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||||
|
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||||
|
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||||
|
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||||
|
SOFTWARE.
|
51
README.md
51
README.md
@ -1,30 +1,36 @@
|
|||||||
# CWIKIUS 文档和手册
|
# CWIKIUS 文档和手册
|
||||||
|
|
||||||
欢迎来到 CWIKIUS 文档和手册的空间
|
欢迎来到 CWIKIUS 文档和手册的空间
|
||||||
|
|
||||||
GitHub 上有关 CWIKIUS 的项目:[https://github.com/cwiki-us-docs/cwikius-docs](https://github.com/cwiki-us-docs/cwikius-docs)
|
GitHub 上有关 CWIKIUS 的项目:[https://src.ossez.com/honeymoose/Framework-Docsify](https://src.ossez.com/honeymoose/Framework-Docsify)
|
||||||
|
|
||||||
|
[联系我们](CONTACT.md ':include')
|
||||||
|
|
||||||
如果您有兴趣参与我们的小组和项目,请使用下面的联系方式和我们联系:
|
## 如何本地运行
|
||||||
|
本项目使用 docsify 进行构建。
|
||||||
|
|
||||||
| 联系方式名称 | 联系方式 |
|
### 安装 docsify
|
||||||
|---|---|
|
如果你的本地计算机中没有安装 docsify, 请运行命令行 `npm i docsify-cli -g` 来进行安装。
|
||||||
| 电子邮件 | [service@ossez.com](mailto:service@ossez.com) |
|
|
||||||
| QQ 或微信 | 103899765 |
|
|
||||||
| QQ 交流群 Spring | 15186112 |
|
|
||||||
| 社区论坛 | [https://www.ossez.com/](https://www.ossez.com/) |
|
|
||||||
|
|
||||||
## 公众平台
|
### 版本检查
|
||||||
我们建议您通过社区论坛来和我们进行沟通,请关注我们公众平台上的账号
|
运行命令 `docsify -version` 来进行版本和环境检查,如果你能看到下面的内容,则说明已经安装成功了。
|
||||||
|
|
||||||
### 微信公众号
|
```text
|
||||||

|
docsify-cli version:
|
||||||
|
4.4.3
|
||||||
|
```
|
||||||
|
|
||||||
### 头条号
|
### 本地运行 docsify
|
||||||
我们也在头条号上创建了我们的公众号,请扫描下面的 QR 关注我们的头条号。
|
在你的本地计算机终端中运行命令 `docsify serve ./` 后,你的控制台将会看到有余下的输出:
|
||||||
|
|
||||||

|
```text
|
||||||
|
PS D:\WorkDir\Repository\honeymoose\Framework-Docsify> docsify serve ./
|
||||||
|
|
||||||
|
Serving D:\WorkDir\Repository\honeymoose\Framework-Docsify now.
|
||||||
|
Listening at http://localhost:3000
|
||||||
|
|
||||||
|
```
|
||||||
|
|
||||||
|
访问使用的默认端口是 3000,随后你可以通过浏览器进行访问。
|
||||||
|
|
||||||
## CWIKIUS 文档和手册快速导航
|
## CWIKIUS 文档和手册快速导航
|
||||||
|
|
||||||
@ -37,6 +43,19 @@ GitHub 上有关 CWIKIUS 的项目:[https://github.com/cwiki-us-docs/cwikius-d
|
|||||||
| [github.io](https://cwiki-us-docs.github.io/cwikius-docs/#/) | [https://cwiki-us-docs.github.io/cwikius-docs/#/](https://cwiki-us-docs.github.io/cwikius-docs/#/) | 本手册的编译版本将会部署在这个链接上 |
|
| [github.io](https://cwiki-us-docs.github.io/cwikius-docs/#/) | [https://cwiki-us-docs.github.io/cwikius-docs/#/](https://cwiki-us-docs.github.io/cwikius-docs/#/) | 本手册的编译版本将会部署在这个链接上 |
|
||||||
| WWW.CWIKIUS.CN | [http://www.cwikius.cn/](http://www.cwikius.cn/) | CWIKIUS.CN 一个有独立思考和温度的清新站 |
|
| WWW.CWIKIUS.CN | [http://www.cwikius.cn/](http://www.cwikius.cn/) | CWIKIUS.CN 一个有独立思考和温度的清新站 |
|
||||||
|
|
||||||
|
### 前端和 UI
|
||||||
|
| 网站名称 | URL | NOTE |
|
||||||
|
|---|---|---|
|
||||||
|
| 前端端技术社区 | https://www.ossez.com/c/toolkit-algorithm-computer-science/web-front-end/26 | 计算机相关的前端框架和讨论 |
|
||||||
|
| Angular 技术手册 | https://angular.ossez.com/ | Angular 手册的在线翻译版本,从源代码中进行编译 |
|
||||||
|
|
||||||
|
|
||||||
|
### 后端和数据层
|
||||||
|
| 网站名称 | URL | NOTE |
|
||||||
|
|---|---|---|
|
||||||
|
| Apache Druid 技术手册 | https://druid.ossez.com/ | Druid 手册的在线翻译版本 |
|
||||||
|
|
||||||
|
|
||||||
### 容器 docker
|
### 容器 docker
|
||||||
| 网站名称 | URL | NOTE |
|
| 网站名称 | URL | NOTE |
|
||||||
|---|---|---|
|
|---|---|---|
|
||||||
|
16
_sidebar.md
16
_sidebar.md
@ -1,12 +1,20 @@
|
|||||||
- CWIKIUS 文档概述
|
- CWIKIUS 文档概述
|
||||||
- [文档介绍和快速链接](README.md)
|
- [文档介绍和快速链接](README.md)
|
||||||
- [公众平台](CONTACT.md)
|
- [联系方式](CONTACT.md)
|
||||||
|
|
||||||
- Gradle
|
- Java
|
||||||
- [Deploy](deploy.md)
|
- [概述和环境配置](java/index.md)
|
||||||
|
- [语言基础](java/fundamentals/index.md)
|
||||||
|
- [核心编程](java/core/index.md)
|
||||||
|
|
||||||
- 其他小工具
|
- 其他小工具
|
||||||
- [JWT](jwt/README.md)
|
- [JWT](jwt/README.md)
|
||||||
|
- [MessagePack](message-pack/index.md)
|
||||||
|
- [Discourse](discourse/index.md)
|
||||||
|
|
||||||
- [Awesome docsify](awesome.md)
|
- 面试和算法
|
||||||
|
- [面试问题和经验](interview/index.md)
|
||||||
|
- [算法题](algorithm/index.md)
|
||||||
|
|
||||||
|
- [DOCS.OSSEZ.COM](https://docs.ossez.com/#/)
|
||||||
- [Changelog](changelog.md)
|
- [Changelog](changelog.md)
|
19
algorithm/index.md
Normal file
19
algorithm/index.md
Normal file
@ -0,0 +1,19 @@
|
|||||||
|
# 算法
|
||||||
|
在应聘技术岗位的时候,可能都会有一个让绝大部分人都比较讨厌的算法环节。
|
||||||
|
|
||||||
|
也不知道是谁搞出这么无聊的东西,但没有办法现实总是残酷的,在抱怨的同时也只能在找工作之前复习下这些在实际工作中基本上不用的算法题了。
|
||||||
|
|
||||||
|
因为 MD 文档格式的限制,所以我们在这里只放一个索引并且维护这个索引,有关的具体内容,请通过索引访问我们的社区进行查看,我们也非常欢迎您参与讨论,
|
||||||
|
您可以在社区注册后进行讨论。
|
||||||
|
|
||||||
|
## 算法问题
|
||||||
|
在这里我将按照我遇到算法问题的先后顺序进行排列。很多算法题目都是题库上面的原题,你可以到题库上面去找找。
|
||||||
|
|
||||||
|
我这里只是结合我在面试的时候遇到的题目来进行解答和进行一些点评,就当时总结和消遣吧,如果你希望有什么问题一起讨论的话,欢迎 Fork 这个项目并且登录社区进行讨论。
|
||||||
|
|
||||||
|
最新的内容在最前面。
|
||||||
|
|
||||||
|
### 内容索引
|
||||||
|
* [A “word-wrap” functionality(一个字符串包裹函数)](https://www.ossez.com/t/a-word-wrap-functionality/13452)
|
||||||
|
* [Prime numbers from 1 to 100 (打印 100 以内的素数)](https://www.ossez.com/t/prime-numbers-from-1-to-100-100/13450)
|
||||||
|
|
@ -1,5 +1,5 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8"?>
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
<module type="WEB_MODULE" version="4">
|
<module type="PYTHON_MODULE" version="4">
|
||||||
<component name="NewModuleRootManager" inherit-compiler-output="true">
|
<component name="NewModuleRootManager" inherit-compiler-output="true">
|
||||||
<exclude-output />
|
<exclude-output />
|
||||||
<content url="file://$MODULE_DIR$" />
|
<content url="file://$MODULE_DIR$" />
|
||||||
|
197
discourse/index.md
Normal file
197
discourse/index.md
Normal file
@ -0,0 +1,197 @@
|
|||||||
|
# Discourse 文档
|
||||||
|
Discourse 文档是通过官方文档的整理翻译过来的,下面的内容与官方的内容基本一致。
|
||||||
|
|
||||||
|
针对中文环境下的时候,我们对遇到的一些问题发布到我们的讨论区中以方便大家快速导航访问:
|
||||||
|
|
||||||
|
- [Discourse CentOS 8 全新安装手册](https://www.ossez.com/t/discourse-centos-8/594) - 在 CentOS/RHEL 平台上全新安装 Discourse 的过程和命令。
|
||||||
|
|
||||||
|
- [Discourse 如何不使用 Let’s Encrypt 而使用 CA 签名的密钥进行安装](https://www.ossez.com/t/discourse-lets-encrypt-ca/552) - 使用你自己已有的 CA 秘钥进行安装。
|
||||||
|
|
||||||
|
- [Discourse 设置 GTM](https://www.ossez.com/t/discourse-gtm/13240) - 使用 Google 的标签管理器来插入需要的 JS 代码。
|
||||||
|
|
||||||
|
## 云平台安装
|
||||||
|
**在基于云平台的 Discourse 安装通常不会超过 30 分钟**,哪怕你没有任何有关 Rails 或 Linux shell 的知识都能够顺利完成安装。
|
||||||
|
下面我们是通过 [DigitalOcean][do] 服务提供商来进行安装测的,但是所有的安装步骤都能够在
|
||||||
|
所有兼容 **Docker** 的云计算平台上进行,同时也可以在本地的服务器上完成安装。
|
||||||
|
|
||||||
|
> 🔔 如果你连 30 分钟都没有的话?你可以联系 Discourse 社区来帮你完成安装,Discourse 社区将会收取一次性 $150 (美元)的费用。 [单击此处链接来对服务进行购买](https://www.literatecomputing.com/product/discourse-install/) 。
|
||||||
|
|
||||||
|
### 创建一个新的云服务器
|
||||||
|
|
||||||
|
创建一个你的新云服务器,例如:[DigitalOcean](https://www.digitalocean.com/?refcode=5fa48ac82415) ,当然你也可以使用其他平台提供的服务器。
|
||||||
|
|
||||||
|
- 默认配置 **当前版本的 LTS Ubuntu 操作系统** 能够很好的工作。最少,需要一个 64 位的 Linux 操作系统,并且这个操作系统的内核需要更新到最新的版本。
|
||||||
|
|
||||||
|
- 默认配置 **1 GB** 的内存针对小型的 Discourse 社区通常都能很好的运行。但我们推荐针对大型社区使用 2 GB 的内存。
|
||||||
|
|
||||||
|
- 默认配置 **New York** 数据中心针对北美和欧洲来说都是不错的地理分区,如果你的 Discourse 用户使用的对象多是其他地理位置的用户,那么你可以选择离你稍近的数据中心。
|
||||||
|
|
||||||
|
- 输入域名 `discourse.example.com` 来在 DigitalOcean 中创建一个 Droplet(Droplet 是 DigitalOcean 定义的服务器名称)。当然你也可以购买使用你自己的域名,通常 Discourse 的安装需要一个真实的域名,没有办法通过 IP 地址安装,所以我们建议你首先购买域名或者使用你已有域名的二级域名。
|
||||||
|
|
||||||
|
创建你的新 Droplet,这个过程就等于你在 DigitalOcean 上创建了一个服务器,也等同你在其他平台上面创建了一个 VPS 或者服务器。
|
||||||
|
当完成创建后,你将会收到一个电子邮件,这个电子邮件中有你的 Root 用户的密码。
|
||||||
|
但是我们建议你 [设置使用 SSH keys](https://www.google.com/search?q=digitalocean+ssh+keys) , 来增强你服务器访问的安全性。
|
||||||
|
|
||||||
|
### 访问你的云服务器
|
||||||
|
|
||||||
|
通过使用 IP 地址,并使用 SSH 来连接和访问你创建的服务器,或者针对 Windows 平台你可以安装 [Putty][put] 后运行下面的命令来进行连接:
|
||||||
|
|
||||||
|
ssh root@192.168.1.1
|
||||||
|
|
||||||
|
如果你没有配置 SSH Key 的话,你可以使用 DigitalOcean 发给你的电子邮件中包含的密码来进行登录,
|
||||||
|
或者使用你本地的 SSH Key 来进行连接。
|
||||||
|
|
||||||
|
### 安装 Docker / Git (可选的)
|
||||||
|
|
||||||
|
如果你希望使用你自己的 Docker 版本,你可以现在在你新设置的服务器上进行安装。
|
||||||
|
如果你的服务器上没有默认安装 Docker,那么 `discourse-setup` 将会自动为你从 get.docker.com 下载后进行安装。
|
||||||
|
|
||||||
|
### 安装 Discourse
|
||||||
|
|
||||||
|
从 [官方 Discourse Docker 镜像][dd] 仓库中克隆代码到本地计算机的 `/var/discourse` 目录。
|
||||||
|
|
||||||
|
sudo -s
|
||||||
|
git clone https://github.com/discourse/discourse_docker.git /var/discourse
|
||||||
|
cd /var/discourse
|
||||||
|
|
||||||
|
你只需要执行上面的命令即可,在 Discourse 安装的过程中需要 root 权限。
|
||||||
|
|
||||||
|
### 电子邮件
|
||||||
|
|
||||||
|
> ⚠️ **电子邮件系统在 Discourse 的用户创建过程中非常重要。**
|
||||||
|
> 如果你没有在安装 Discourse 之前创建电子邮件 SMTP 服务器,那么你安装的 Discourse 无法访问也无法登录(HAVE A BROKEN SITE)!
|
||||||
|
|
||||||
|
- 如果你已经有你自己的 SMTP 邮件服务器了,那么你就可以直接使用你已有的邮件服务器配置信息。
|
||||||
|
|
||||||
|
- 还有没有邮件服务器?请访问 [**Discourse 推荐使用的邮件服务器**][mailconfig].
|
||||||
|
|
||||||
|
- 为了确保你的邮件能够被正常投递,你必须在你的 DNS 中添加有效的 [SPF 和 DKIM 记录](https://www.google.com/search?q=spf+dkim) 。请访问你邮件服务提供商的文档如何设置这些信息。
|
||||||
|
|
||||||
|
根据我们实际使用的情况,Discourse 的安装**必须**配置可用的域名和邮件服务器,针对中国境内的情况,你可以使用阿里云或者腾讯云提供的企业邮箱。
|
||||||
|
通常我们建议你使用境外的邮件服务器,比如说 AWS 的 SES,或者 MailGun 都是不错的服务,你可能需要一张国际信用卡完成校验。
|
||||||
|
但这一步是必须的,否则你的的 Discourse 无法完成安装。
|
||||||
|
|
||||||
|
### 域名
|
||||||
|
|
||||||
|
> 🔔 Discourse 不能通过 IP 地址来工作,你必须拥有一个域名或者二级域名来进行安装,例如 `example.com` 。
|
||||||
|
|
||||||
|
- 如果你已经拥有一个域名了,那么可以选择任何一个二级域名来进行安装,例如 `discourse.example.com` 或 `talk.example.com` 或 `forum.example.com` 来安装你的 Discourse 实例。
|
||||||
|
|
||||||
|
- 还没有域名的话,你可以访问 [NameCheap](https://www.namecheap.com/domains/domain-name-search/) 网站来搜索你喜欢的域名,或者直接 Google 搜索 [great domain name registrars](https://www.google.com/search?q=best+domain+name+registrars) 来选择你喜欢的域名注册商。
|
||||||
|
|
||||||
|
- 你的 DNS 控制台应该是能够访问的,在你购买域名后,你还需要访问你的 DNS 配置来配置 DNS。针对你安装的 Discourse 网站,你需要通过你的 DNS 创建一个 [`A` 记录](https://support.dnsimple.com/articles/a-record/) ,这个 A 记录需要将你要安装的域名指向到一个特定的 IP 地址。这个 IP 地址通常为你在第一步购买的服务器 IP 地址。
|
||||||
|
|
||||||
|
### 编辑 Discourse 配置
|
||||||
|
|
||||||
|
通过下面的命令运行配置工具
|
||||||
|
|
||||||
|
./discourse-setup
|
||||||
|
|
||||||
|
你需要根据下面的提示配置所有参数:
|
||||||
|
|
||||||
|
Hostname for your Discourse? [discourse.example.com]:
|
||||||
|
Email address for admin account(s)? [me@example.com,you@example.com]:
|
||||||
|
SMTP server address? [smtp.example.com]:
|
||||||
|
SMTP port? [587]:
|
||||||
|
SMTP user name? [user@example.com]:
|
||||||
|
SMTP password? [pa$$word]:
|
||||||
|
Let's Encrypt account email? (ENTER to skip) [me@example.com]:
|
||||||
|
|
||||||
|
上面的输入数据将会为你的 Discourse 实例创建一个 `app.yml` 文件,这个文件将会在安装进行后对你的 Discourse 实例进行配置。
|
||||||
|
整个安装启动过程可能需要耗费 **2-8 分钟** 来为你的配置 Discourse。
|
||||||
|
如果在安装完成后你还需要对你的配置进行修改,你可以再次运行 `./discourse-setup` 命令(这个命令将会把已经存在的 `app.yml` 文件重新载入)。
|
||||||
|
或者你也可以手动直接编辑 `/containers/app.yml` 文件中的内容,然后再次运行 `./launcher rebuild app`,否则你的修改是不会生效的。
|
||||||
|
|
||||||
|
### 启动 Discourse
|
||||||
|
|
||||||
|
一旦初始化安装配置完成后,你的 Discourse 示例应该可以通过你配置的域名 `discourse.example.com` 在浏览器上进行访问。
|
||||||
|
|
||||||
|
<img src="https://cdn.ossez.com/discourse-uploads/optimized/2X/8/8db53b9128ec4fb74872bdb7c1231ff04d525218_2_616x500.png" width="650">
|
||||||
|
|
||||||
|
### 注册一个新的管理员账号
|
||||||
|
|
||||||
|
使用你再启动配置过程中输入的电子邮件地址来注册一个管理员账号。
|
||||||
|
|
||||||
|
<img src="https://cdn.ossez.com/discourse-uploads/original/2X/9/99476eac0ffa4aa3a923aa7ae864fedf546dab0a.png" width="650">
|
||||||
|
|
||||||
|
<img src="https://cdn.ossez.com/discourse-uploads/original/2X/5/58660d377a00d9797be8b74036ace9d0ebf57fff.png" width="650">
|
||||||
|
|
||||||
|
(如果你不能注册你的管理账号(Admin),请通过路径`/var/discourse/shared/standalone/log/rails/production.log` 检查日志,或者访问 [电子邮件问题检查列表](https://meta.discourse.org/t/troubleshooting-email-on-a-new-discourse-install/16326) 。)
|
||||||
|
|
||||||
|
当你完成管理员账号的注册后,设置向导将会启动并指引你配置你的 Discourse 实例。
|
||||||
|
|
||||||
|
<img src="https://cdn.ossez.com/discourse-uploads/original/2X/9/944509dd0c049a2cec42d6108369fa5cf5d92d0d.png" width="650">
|
||||||
|
|
||||||
|
当完成所有的设置向导,你将会看到职员主题(Staff topics)和 **READ ME FIRST: Admin Quick Start Guide** 。
|
||||||
|
这个配置向导将会包含有针对后续配置的的一些建议和如何对你的 Discourse 安装实例进行自定义配置。
|
||||||
|
|
||||||
|
<img src="https://cdn.ossez.com/discourse-uploads/original/2X/8/8a60bc840705aaa1fc77b039a7babf77d6b4a10b.png" width="650">
|
||||||
|
|
||||||
|
### 安装后的维护
|
||||||
|
|
||||||
|
- 我们强烈建议打开你针对你操作系统的安全自动更新。在 Ubuntu 使用 `dpkg-reconfigure -plow unattended-upgrades` 命令。在 CentOS/RHEL,使用 [`yum-cron`](https://www.cyberciti.biz/faq/fedora-automatic-update-retrieval-installation-with-cron/) 包。
|
||||||
|
- 如果你使用的是密码登录你的操作系统,而不是使用 SSH Key 的话,请确保你使用强密码。在 Ubuntu 使用 `apt-get install libpam-cracklib` 包。我们推荐使用 `fail2ban` ,这个将会对 3 次登录失败的 IP 地址禁止登录 10 分钟。
|
||||||
|
- **Ubuntu**: `apt-get install fail2ban`
|
||||||
|
- **CentOS/RHEL**: `sudo yum install fail2ban` (需要 [EPEL](https://support.rackspace.com/how-to/install-epel-and-additional-repositories-on-centos-and-red-hat/))
|
||||||
|
- 如果你希望默认安装防火墙, 针对 Ubuntu [打开 ufw](https://meta.discourse.org/t/configure-a-firewall-for-discourse/20584) 或者针对 CentOS/RHEL 7 及其后续版本使用 `firewalld` 。
|
||||||
|
|
||||||
|
当 Discourse 有新版本更新的时候,你的邮件地址将会收到更新提示。
|
||||||
|
请随时更新你的 Discourse 实例到最新版本以确保所有的安全问题被修复。
|
||||||
|
要 **更新 Discourse 到最新的版本**,请通过你的浏览器访问 `/admin/upgrade` 然后单击更新按钮。
|
||||||
|
|
||||||
|
`/var/discourse` 目录中的 `launcher` 命令被用来使用一些系统级别的维护:
|
||||||
|
|
||||||
|
``` text
|
||||||
|
Usage: launcher COMMAND CONFIG [--skip-prereqs] [--docker-args STRING]
|
||||||
|
Commands:
|
||||||
|
start: Start/initialize a container(启动/初始化容器)
|
||||||
|
stop: Stop a running container(停止一个运行的容器)
|
||||||
|
restart: Restart a container(重启容器)
|
||||||
|
destroy: Stop and remove a container (停止然后删除一个容器)
|
||||||
|
enter: Use nsenter to get a shell into a container (使用 nsenter 来访问容器内的 Shell)
|
||||||
|
logs: View the Docker logs for a container(查看一个容器的日志)
|
||||||
|
bootstrap: Bootstrap a container for the config based on a template(从配置模板中来启动一个容器的配置和初始化)
|
||||||
|
rebuild: Rebuild a container (destroy old, bootstrap, start new)(重构一个容器,将会删除老的容器,初始一个容器,启动新的容器)
|
||||||
|
cleanup: Remove all containers that have stopped for > 24 hours(针对停止运行超过 24 个小时的容器进行删除)
|
||||||
|
|
||||||
|
Options:
|
||||||
|
--skip-prereqs Don't check launcher prerequisites (不运行安装器的环境校验)
|
||||||
|
--docker-args Extra arguments to pass when running docker (传递给容器内的额外参数)
|
||||||
|
```
|
||||||
|
|
||||||
|
### 添加更多的 Discourse 特性
|
||||||
|
|
||||||
|
下面的内容是一些快速的链接,能够帮助你扩展 Discourse 安装的功能:
|
||||||
|
|
||||||
|
- Users to log in *only* via your pre-existing website's registration system? [Configure Single-Sign-On](https://meta.discourse.org/t/official-single-sign-on-for-discourse/13045).
|
||||||
|
|
||||||
|
- 用户可以使用 [Google](https://www.ossez.com/t/discourse-google-google-login/13582), [Twitter](https://meta.discourse.org/t/configuring-twitter-login-for-discourse/13395), [GitHub](https://www.ossez.com/t/discourse-github/13562), or [Facebook](https://meta.discourse.org/t/configuring-facebook-login-for-discourse/13394) 进行注册登录。
|
||||||
|
|
||||||
|
- Users to post replies via email? [Configure reply via email](https://meta.discourse.org/t/set-up-reply-via-email-support/14003).
|
||||||
|
|
||||||
|
- Automatic daily backups? [Configure backups](https://meta.discourse.org/t/configure-automatic-backups-for-discourse/14855).
|
||||||
|
|
||||||
|
- Free HTTPS / SSL support? [Configure Let's Encrypt](https://meta.discourse.org/t/setting-up-lets-encrypt-cert-with-discourse-docker/40709). Paid HTTPS / SSL support? [Configure SSL](https://meta.discourse.org/t/allowing-ssl-for-your-discourse-docker-setup/13847).
|
||||||
|
|
||||||
|
- Use a plugin [from Discourse](https://github.com/discourse) or a third party? [Configure plugins](https://meta.discourse.org/t/install-a-plugin/19157)
|
||||||
|
|
||||||
|
- Multiple Discourse sites on the same server? [Configure multisite](https://meta.discourse.org/t/multisite-configuration-with-docker/14084).
|
||||||
|
|
||||||
|
- Webhooks when events happen in Discourse? [Configure webhooks](https://meta.discourse.org/t/setting-up-webhooks/49045).
|
||||||
|
|
||||||
|
- A Content Delivery Network to speed up worldwide access? [Configure a CDN](https://meta.discourse.org/t/enable-a-cdn-for-your-discourse/14857). We recommend [Fastly](http://www.fastly.com/).
|
||||||
|
|
||||||
|
- Import old content from vBulletin, PHPbb, Vanilla, Drupal, BBPress, etc? [See our open source importers](https://github.com/discourse/discourse/tree/main/script/import_scripts).
|
||||||
|
|
||||||
|
- A user friendly [offline page when rebuilding or upgrading?](https://meta.discourse.org/t/adding-an-offline-page-when-rebuilding/45238)
|
||||||
|
|
||||||
|
- To embed Discourse [in your WordPress install](https://github.com/discourse/wp-discourse), or [on your static HTML site](https://meta.discourse.org/t/embedding-discourse-comments-via-javascript/31963)?
|
||||||
|
|
||||||
|
Help us improve this guide! Feel free to ask about it on [meta.discourse.org][meta], or even better, submit a pull request.
|
||||||
|
|
||||||
|
[dd]: https://github.com/discourse/discourse_docker
|
||||||
|
[ssh]: https://help.github.com/articles/generating-ssh-keys
|
||||||
|
[meta]: https://meta.discourse.org
|
||||||
|
[do]: https://www.digitalocean.com/?refcode=5fa48ac82415
|
||||||
|
[put]: http://www.chiark.greenend.org.uk/~sgtatham/putty/download.html
|
||||||
|
[mailconfig]: https://github.com/discourse/discourse/blob/main/docs/INSTALL-email.md
|
BIN
gradle/wrapper/gradle-wrapper.jar
vendored
BIN
gradle/wrapper/gradle-wrapper.jar
vendored
Binary file not shown.
5
gradle/wrapper/gradle-wrapper.properties
vendored
5
gradle/wrapper/gradle-wrapper.properties
vendored
@ -1,5 +0,0 @@
|
|||||||
distributionBase=GRADLE_USER_HOME
|
|
||||||
distributionPath=wrapper/dists
|
|
||||||
distributionUrl=https\://services.gradle.org/distributions/gradle-5.4-bin.zip
|
|
||||||
zipStoreBase=GRADLE_USER_HOME
|
|
||||||
zipStorePath=wrapper/dists
|
|
18
index.html
18
index.html
@ -16,14 +16,26 @@
|
|||||||
<meta name="description" content="Description">
|
<meta name="description" content="Description">
|
||||||
<meta name="viewport"
|
<meta name="viewport"
|
||||||
content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0">
|
content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0">
|
||||||
<link rel="stylesheet" href="//cdn.jsdelivr.net/npm/docsify/lib/themes/vue.css">
|
<link rel="stylesheet" href="//cdn.jsdelivr.net/npm/docsify-themeable@0/dist/css/theme-simple.css">
|
||||||
|
<style>
|
||||||
|
:root {
|
||||||
|
/* Reduce the font size */
|
||||||
|
/* --base-font-size: 14px; */
|
||||||
|
/* Change the theme color hue (0-360) */
|
||||||
|
/* --theme-hue: 325; */
|
||||||
|
/* Add sidebar navigation bullets */
|
||||||
|
/* --sidebar-nav-link-before-content-l1: "😀"; */
|
||||||
|
/* --sidebar-nav-link-before-content-l2: "💩"; */
|
||||||
|
--link-color: var(--theme-color);
|
||||||
|
}
|
||||||
|
</style>
|
||||||
</head>
|
</head>
|
||||||
<body>
|
<body>
|
||||||
<div id="app"></div>
|
<div id="app"></div>
|
||||||
<script>
|
<script>
|
||||||
window.$docsify = {
|
window.$docsify = {
|
||||||
name: 'CWIKIUS 文档手册',
|
name: 'CWIKIUS 文档手册 模板',
|
||||||
repo: 'https://github.com/cwiki-us-docs/cwikius-docs',
|
repo: 'https://src.ossez.com/honeymoose/Framework-Docsify',
|
||||||
executeScript: true,
|
executeScript: true,
|
||||||
loadNavbar: true,
|
loadNavbar: true,
|
||||||
mergeNavbar: true,
|
mergeNavbar: true,
|
||||||
|
BIN
interview/_images/it-job-interview.jpg
Normal file
BIN
interview/_images/it-job-interview.jpg
Normal file
Binary file not shown.
After Width: | Height: | Size: 9.9 KiB |
28
interview/index.md
Normal file
28
interview/index.md
Normal file
@ -0,0 +1,28 @@
|
|||||||
|
# 面试问题和经验文档
|
||||||
|
在应聘技术岗位的时候,通常会要求你进行一些算法和基础知识的考核。因计算机的知识比较复杂概念也非常多,这就给应聘者带来很大的困惑,应该怎么去做?
|
||||||
|
|
||||||
|
同时面试官很多时候也是突击某个问题,然后拿着这个问题来问应聘者。结果就导致了很多问题非常刁钻古怪,甚至有时候你根本就不可能在实际开发中遇到。
|
||||||
|
|
||||||
|
不管怎么样,这种面试方式至少目前来说是一种趋势,所以我们尽量收集一些技术岗的面试经验供大家参考。
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
|
||||||
|
因为 MD 文档格式的限制,所以我们在这里只放一个索引并且维护这个索引,有关的具体内容,请通过索引访问我们的社区进行查看,我们也非常欢迎您参与讨论,
|
||||||
|
您可以在社区注册后进行讨论。
|
||||||
|
|
||||||
|
## 面试问题和经验索引
|
||||||
|
在这里我们希望按照年份进行一些分开,这样能够帮助大家尽量区分时间,同时我们的排序是按照倒序排列的。
|
||||||
|
|
||||||
|
最新的内容在最前面(按照时间倒序排序)。
|
||||||
|
|
||||||
|
### 2021
|
||||||
|
* [2021 疫情期间美国公司技术岗的面试流程](https://www.ossez.com/t/topic/13463)
|
||||||
|
* [从拒绝到被拒绝](https://www.ossez.com/t/topic/13462)
|
||||||
|
* [从一个工作到一个工作](https://www.ossez.com/t/topic/13461)
|
||||||
|
* [北美亚特兰大一金融服务公司面试总结](https://www.ossez.com/t/topic/13453)
|
||||||
|
* [北美一工作搜索引擎公司技术岗面经](https://www.ossez.com/t/topic/13451)
|
||||||
|
* [一房地产数据服务初创公司的面经](https://www.ossez.com/t/topic/13441)
|
||||||
|
|
||||||
|
### 2019
|
||||||
|
* [IT 技术岗位 2019 年北美求职流水账](https://www.ossez.com/t/it-2019/13433)
|
2
java/collection/index.md
Normal file
2
java/collection/index.md
Normal file
@ -0,0 +1,2 @@
|
|||||||
|
# 集合
|
||||||
|
|
4
java/core/annotation.md
Normal file
4
java/core/annotation.md
Normal file
@ -0,0 +1,4 @@
|
|||||||
|
# Annotation(注解)
|
||||||
|
* [Java @Deprecated Annotation(注解)](https://www.ossez.com/t/java-deprecated-annotation/13676)
|
||||||
|
|
||||||
|
|
3
java/core/index.md
Normal file
3
java/core/index.md
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
# Java 核心编程
|
||||||
|
|
||||||
|
[Annotation(注解)](annotation.md ':include')
|
2
java/fundamentals/concept.md
Normal file
2
java/fundamentals/concept.md
Normal file
@ -0,0 +1,2 @@
|
|||||||
|
# 基本概念
|
||||||
|
|
2
java/fundamentals/data-type.md
Normal file
2
java/fundamentals/data-type.md
Normal file
@ -0,0 +1,2 @@
|
|||||||
|
# 数据类型
|
||||||
|
|
2
java/fundamentals/exceptions.md
Normal file
2
java/fundamentals/exceptions.md
Normal file
@ -0,0 +1,2 @@
|
|||||||
|
# 异常处理
|
||||||
|
|
2
java/fundamentals/index.md
Normal file
2
java/fundamentals/index.md
Normal file
@ -0,0 +1,2 @@
|
|||||||
|
# 语言基础
|
||||||
|
|
2
java/fundamentals/io.md
Normal file
2
java/fundamentals/io.md
Normal file
@ -0,0 +1,2 @@
|
|||||||
|
# I/O 操作
|
||||||
|
|
2
java/fundamentals/language-structure.md
Normal file
2
java/fundamentals/language-structure.md
Normal file
@ -0,0 +1,2 @@
|
|||||||
|
# 语言结构
|
||||||
|
|
2
java/fundamentals/method-function.md
Normal file
2
java/fundamentals/method-function.md
Normal file
@ -0,0 +1,2 @@
|
|||||||
|
# 方法和函数
|
||||||
|
|
2
java/fundamentals/reflection.md
Normal file
2
java/fundamentals/reflection.md
Normal file
@ -0,0 +1,2 @@
|
|||||||
|
# 反射
|
||||||
|
|
10
java/index.md
Normal file
10
java/index.md
Normal file
@ -0,0 +1,10 @@
|
|||||||
|
# Java 技术问题导航
|
||||||
|
Java 是由 Sun Microsystems 公司于1995年5月推出的Java面向对象程序设计语言和Java平台的总称(Java 1.0 [J2SE])。由James Gosling和同事们共同研发,并在1995年正式推出。
|
||||||
|
|
||||||
|
本页面中主要对 Java 使用的基础知识和配置的内容进行快速导航。
|
||||||
|
|
||||||
|
## 安装
|
||||||
|
* [Windows 环境下安装 Oracle JDK](https://www.ossez.com/t/windows-oracle-jdk/7254)
|
||||||
|
|
||||||
|
## 配置环境
|
||||||
|
* [Java 在 Windows 10 中配置环境变量](https://www.ossez.com/t/java-windows-10/13675)
|
3
java/jvm/index.md
Normal file
3
java/jvm/index.md
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
# JVM
|
||||||
|
|
||||||
|
|
3
java/multi-thread/index.md
Normal file
3
java/multi-thread/index.md
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
# 多线程
|
||||||
|
|
||||||
|
|
3
java/new-features/index.md
Normal file
3
java/new-features/index.md
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
# 新特性
|
||||||
|
|
||||||
|
|
BIN
message-pack/_images/messagepack-logo.jpg
Normal file
BIN
message-pack/_images/messagepack-logo.jpg
Normal file
Binary file not shown.
After Width: | Height: | Size: 32 KiB |
549
message-pack/index.md
Normal file
549
message-pack/index.md
Normal file
@ -0,0 +1,549 @@
|
|||||||
|
# MessagePack 文档
|
||||||
|
|
||||||
|
中文标题【MessagePack Java 0.6.X 快速开始指南】
|
||||||
|
|
||||||
|
MessagePack 的相关文档,本文是根据官方的内容和我们项目中的具体实践进行编辑的。
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
> :warning: 0.6.x 版本的 MessagePack 已经过期被淘汰了。如果你现在开始使用 MessagePack 话,请不要使用这个版本。
|
||||||
|
|
||||||
|
我们在这里保留 0.6.x 版本的内容主要用于参考用途。
|
||||||
|
|
||||||
|
最新的 MessagePack 版本请参考: https://github.com/msgpack/msgpack-java 中的项目源代码。
|
||||||
|
|
||||||
|
:information_source: MessagePack 中文文档请参考: http://docs.ossez.com/messagepack-docs/index.html
|
||||||
|
|
||||||
|
:information_source: MessagePack 测试和示例源代码: https://github.com/cwiki-us-demo/serialize-deserialize-demo-java
|
||||||
|
|
||||||
|
|
||||||
|
这个指南提供了使用 msgpack-java 的快速指南。在开始的时候,我们将会介绍如何安装 msgpack-java,然后将会运行如何使用 msgpack 来对对象序列化/反序列化(serialize/deserizalize)对象。
|
||||||
|
|
||||||
|
## 安装
|
||||||
|
你可以使用下面 2 种方法来安装 msgpack-java —— 从 maven 下载或者直接构建 jar 包。
|
||||||
|
|
||||||
|
### 从 Maven2 仓库中进行安装
|
||||||
|
MessagePack 针对 Java 的使用已经发布到 Maven 的中央仓库中(Maven Central Repository)。你可以使用下面的参数来配置你项目的 pom.xml 文件。
|
||||||
|
|
||||||
|
````xml
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.msgpack</groupId>
|
||||||
|
<artifactId>msgpack</artifactId>
|
||||||
|
<version>${msgpack.version}</version>
|
||||||
|
</dependency>
|
||||||
|
````
|
||||||
|
|
||||||
|
你需要将 ${msgpack.version} 替换为当前的 MessagePack 版本,有关可以使用的具体版本你可以访问 http://repo1.maven.org/maven2/org/msgpack/msgpack/ 中的版本。
|
||||||
|
|
||||||
|
请注意,在 0.6.x 版本中最新的版本只更新到 0.6.12。
|
||||||
|
|
||||||
|
### 从 git 仓库中进行安装
|
||||||
|
你可以从代码仓库中获得最新的代码。
|
||||||
|
|
||||||
|
----
|
||||||
|
```bash
|
||||||
|
$ git clone git@github.com:msgpack/msgpack-java.git
|
||||||
|
$ cd msgpack-java
|
||||||
|
$ mvn package
|
||||||
|
```
|
||||||
|
|
||||||
|
使用上面的代码进行编译后u,你将会在 msgpack-java/target 目录中得到 msgpack.jar 包。
|
||||||
|
|
||||||
|
同时你也需要 https://code.google.com/p/json-simple/ 和 https://github.com/jboss-javassist/javassist 来让 msgpack.jar 可以在项目中使用。否则你将会收到 NoClassDefFoundError 错误。
|
||||||
|
|
||||||
|
## 如何使用
|
||||||
|
下面是如何使用的示例代码。
|
||||||
|
|
||||||
|
### 使用一个消息打包(message-packable)类
|
||||||
|
使用注解 '_@Message_' 来让你可以序列化你自己类中对象的 public 字段。
|
||||||
|
|
||||||
|
本代码可以在 https://github.com/cwiki-us-demo/messagepack-6-demo-java/blob/master/src/test/java/com/insight/demo/msgpack/MessagePack6Object.java 中下载到本地后进行编译测试。
|
||||||
|
|
||||||
|
```java
|
||||||
|
package com.insight.demo.msgpack;
|
||||||
|
|
||||||
|
import org.junit.Test;
|
||||||
|
import org.msgpack.MessagePack;
|
||||||
|
import org.msgpack.annotation.Message;
|
||||||
|
import org.slf4j.Logger;
|
||||||
|
import org.slf4j.LoggerFactory;
|
||||||
|
|
||||||
|
import java.util.UUID;
|
||||||
|
|
||||||
|
import static org.junit.Assert.assertEquals;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* MessagePack6Objects
|
||||||
|
*
|
||||||
|
* @author yhu
|
||||||
|
*/
|
||||||
|
public class MessagePack6Object {
|
||||||
|
final Logger logger = LoggerFactory.getLogger(MessagePack6Object.class);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* MessageData Message Object
|
||||||
|
*/
|
||||||
|
@Message // Annotation
|
||||||
|
public static class MessageData {
|
||||||
|
// public fields are serialized.
|
||||||
|
public String uuid;
|
||||||
|
public String name;
|
||||||
|
public double version;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Test MessagePack6Objects
|
||||||
|
*/
|
||||||
|
@Test
|
||||||
|
public void testMessagePack6Objects() {
|
||||||
|
logger.debug("MessagePack6Objects for Objects");
|
||||||
|
|
||||||
|
String uuid = UUID.randomUUID().toString();
|
||||||
|
|
||||||
|
// INIT OBJ
|
||||||
|
MessageData src = new MessageData();
|
||||||
|
src.uuid = uuid;
|
||||||
|
src.name = "MessagePack6";
|
||||||
|
src.version = 0.6;
|
||||||
|
|
||||||
|
try {
|
||||||
|
MessagePack msgPack = new MessagePack();
|
||||||
|
|
||||||
|
// Serialization
|
||||||
|
logger.debug("------ Serialization ------");
|
||||||
|
byte[] bytes = msgPack.write(src);
|
||||||
|
logger.debug("Bytes Array Length: [{}]", bytes.length);
|
||||||
|
|
||||||
|
// Deserialization
|
||||||
|
logger.debug("------ Deserialization ------");
|
||||||
|
MessageData dst = msgPack.read(bytes, MessageData.class);
|
||||||
|
logger.debug("Check Object for UUID: [{}]", dst.uuid);
|
||||||
|
|
||||||
|
assertEquals(uuid, dst.uuid);
|
||||||
|
|
||||||
|
} catch (Exception ex) {
|
||||||
|
logger.error("MessagePack Serialization And Deserialization error", ex);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
如果你希望按照顺序序列化多个对象的话,你可以使用 '_Packer_' 和 '_Unpacker_' 多个对象。
|
||||||
|
|
||||||
|
这是因为 '_MessagePack.write(Object)_' 和 '_read(byte[])_' 实际上每次都调用创建了 '_Packer_' 和 '_Unpacker_' 对象。
|
||||||
|
|
||||||
|
为了使用 '_Packer_' 和 '_Unpacker_' 对象,请调用 '_createPacker(OutputStream)_' 和 '_createUnpacker(InputStream)_'。
|
||||||
|
|
||||||
|
本代码可以 https://github.com/cwiki-us-demo/messagepack-6-demo-java/blob/master/src/test/java/com/insight/demo/msgpack/MessagePack6Objects.java 中查看。
|
||||||
|
|
||||||
|
|
||||||
|
```java
|
||||||
|
package com.insight.demo.msgpack;
|
||||||
|
|
||||||
|
import org.junit.Test;
|
||||||
|
import org.msgpack.MessagePack;
|
||||||
|
import org.msgpack.annotation.Message;
|
||||||
|
import org.msgpack.packer.Packer;
|
||||||
|
import org.msgpack.unpacker.Unpacker;
|
||||||
|
import org.slf4j.Logger;
|
||||||
|
import org.slf4j.LoggerFactory;
|
||||||
|
|
||||||
|
import java.io.ByteArrayInputStream;
|
||||||
|
import java.io.ByteArrayOutputStream;
|
||||||
|
import java.util.UUID;
|
||||||
|
|
||||||
|
import static org.junit.Assert.assertEquals;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* MessagePack6Objects
|
||||||
|
*
|
||||||
|
* @author yhu
|
||||||
|
*/
|
||||||
|
public class MessagePack6Objects {
|
||||||
|
final Logger logger = LoggerFactory.getLogger(MessagePack6Objects.class);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* MessageData Message Objects
|
||||||
|
*/
|
||||||
|
@Message // Annotation
|
||||||
|
public static class MessageData {
|
||||||
|
// public fields are serialized.
|
||||||
|
public String uuid;
|
||||||
|
public String name;
|
||||||
|
public double version;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Test MessagePack6Objects
|
||||||
|
*/
|
||||||
|
@Test
|
||||||
|
public void testMessagePack6Objects() {
|
||||||
|
logger.debug("MessagePack6Objects for Objects");
|
||||||
|
|
||||||
|
String uuid = UUID.randomUUID().toString();
|
||||||
|
|
||||||
|
// INIT OBJ
|
||||||
|
MessageData src1 = new MessageData();
|
||||||
|
src1.uuid = uuid;
|
||||||
|
src1.name = "MessagePack6-src1";
|
||||||
|
src1.version = 0.6;
|
||||||
|
|
||||||
|
MessageData src2 = new MessageData();
|
||||||
|
src2.uuid = uuid;
|
||||||
|
src2.name = "MessagePack6-src2";
|
||||||
|
src2.version = 10.6;
|
||||||
|
|
||||||
|
MessageData src3 = new MessageData();
|
||||||
|
src3.uuid = uuid;
|
||||||
|
src3.name = "MessagePack6-src3";
|
||||||
|
src3.version = 1.6;
|
||||||
|
|
||||||
|
try {
|
||||||
|
MessagePack msgPack = new MessagePack();
|
||||||
|
|
||||||
|
// Serialization
|
||||||
|
logger.debug("------ Serialization ------");
|
||||||
|
ByteArrayOutputStream out = new ByteArrayOutputStream();
|
||||||
|
Packer packer = msgPack.createPacker(out);
|
||||||
|
packer.write(src1);
|
||||||
|
packer.write(src2);
|
||||||
|
packer.write(src3);
|
||||||
|
|
||||||
|
byte[] bytes = out.toByteArray();
|
||||||
|
logger.debug("Bytes Array Length: [{}]", bytes.length);
|
||||||
|
|
||||||
|
// Deserialization
|
||||||
|
logger.debug("------ Deserialization ------");
|
||||||
|
ByteArrayInputStream in = new ByteArrayInputStream(bytes);
|
||||||
|
Unpacker unpacker = msgPack.createUnpacker(in);
|
||||||
|
|
||||||
|
MessageData dst1 = unpacker.read(MessageData.class);
|
||||||
|
MessageData dst2 = unpacker.read(MessageData.class);
|
||||||
|
MessageData dst3 = unpacker.read(MessageData.class);
|
||||||
|
|
||||||
|
logger.debug("Check Object for UUID: [{}]", dst1.uuid);
|
||||||
|
|
||||||
|
assertEquals(uuid, dst1.uuid);
|
||||||
|
|
||||||
|
} catch (Exception ex) {
|
||||||
|
logger.error("MessagePack Serialization And Deserialization error", ex);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### 多种类型变量的序列化和反序列化(serialization/deserialization)
|
||||||
|
|
||||||
|
类 '_Packer/Unpacker_' 允许序列化和反序列化多种类型的变量,如后续程序所示。这个类启用序列化和反序列化多种类型的变量和序列化主要类型变量以及包装类,'_String_' 对象,
|
||||||
|
'_byte[]_' 对象,'_ByteBuffer 对象等的方法相似。
|
||||||
|
|
||||||
|
如上面提示的,你可以序列化和反序列化你自己的对象,前提是你自己的对象需要使用 '_@Message_' 注解。
|
||||||
|
|
||||||
|
本代码可以在 https://github.com/cwiki-us-demo/messagepack-6-demo-java/blob/master/src/test/java/com/insight/demo/msgpack/MessagePack6Types.java 中查看。
|
||||||
|
|
||||||
|
```java
|
||||||
|
package com.insight.demo.msgpack;
|
||||||
|
|
||||||
|
import org.junit.Test;
|
||||||
|
import org.msgpack.MessagePack;
|
||||||
|
import org.msgpack.packer.Packer;
|
||||||
|
import org.msgpack.unpacker.Unpacker;
|
||||||
|
import org.slf4j.Logger;
|
||||||
|
import org.slf4j.LoggerFactory;
|
||||||
|
|
||||||
|
import java.io.ByteArrayInputStream;
|
||||||
|
import java.io.ByteArrayOutputStream;
|
||||||
|
import java.math.BigInteger;
|
||||||
|
import java.nio.ByteBuffer;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* MessagePack6Types
|
||||||
|
*
|
||||||
|
* @author yhu
|
||||||
|
*/
|
||||||
|
public class MessagePack6Types {
|
||||||
|
final Logger logger = LoggerFactory.getLogger(MessagePack6Types.class);
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Test MessagePack6Types
|
||||||
|
*/
|
||||||
|
@Test
|
||||||
|
public void testMessagePack6Types() {
|
||||||
|
logger.debug("testMessagePack6Types for Types");
|
||||||
|
|
||||||
|
MessagePack msgpack = new MessagePack();
|
||||||
|
try {
|
||||||
|
|
||||||
|
//
|
||||||
|
// Serialization
|
||||||
|
//
|
||||||
|
ByteArrayOutputStream out = new ByteArrayOutputStream();
|
||||||
|
Packer packer = msgpack.createPacker(out);
|
||||||
|
|
||||||
|
// Serialize values of primitive types
|
||||||
|
packer.write(true); // boolean value
|
||||||
|
packer.write(10); // int value
|
||||||
|
packer.write(10.5); // double value
|
||||||
|
|
||||||
|
// Serialize objects of primitive wrapper types
|
||||||
|
packer.write(Boolean.TRUE);
|
||||||
|
packer.write(new Integer(10));
|
||||||
|
packer.write(new Double(10.5));
|
||||||
|
|
||||||
|
// Serialize various types of arrays
|
||||||
|
packer.write(new int[]{1, 2, 3, 4});
|
||||||
|
packer.write(new Double[]{10.5, 20.5});
|
||||||
|
packer.write(new String[]{"msg", "pack", "for", "java"});
|
||||||
|
packer.write(new byte[]{0x30, 0x31, 0x32}); // byte array
|
||||||
|
|
||||||
|
// Serialize various types of other reference values
|
||||||
|
packer.write("MessagePack"); // String object
|
||||||
|
packer.write(ByteBuffer.wrap(new byte[]{0x30, 0x31, 0x32})); // ByteBuffer object
|
||||||
|
packer.write(BigInteger.ONE); // BigInteger object
|
||||||
|
|
||||||
|
//
|
||||||
|
// Deserialization
|
||||||
|
//
|
||||||
|
byte[] bytes = out.toByteArray();
|
||||||
|
ByteArrayInputStream in = new ByteArrayInputStream(bytes);
|
||||||
|
Unpacker unpacker = msgpack.createUnpacker(in);
|
||||||
|
|
||||||
|
// to primitive values
|
||||||
|
boolean b = unpacker.readBoolean(); // boolean value
|
||||||
|
int i = unpacker.readInt(); // int value
|
||||||
|
double d = unpacker.readDouble(); // double value
|
||||||
|
|
||||||
|
// to primitive wrapper value
|
||||||
|
Boolean wb = unpacker.read(Boolean.class);
|
||||||
|
Integer wi = unpacker.read(Integer.class);
|
||||||
|
Double wd = unpacker.read(Double.class);
|
||||||
|
|
||||||
|
// to arrays
|
||||||
|
int[] ia = unpacker.read(int[].class);
|
||||||
|
Double[] da = unpacker.read(Double[].class);
|
||||||
|
String[] sa = unpacker.read(String[].class);
|
||||||
|
byte[] ba = unpacker.read(byte[].class);
|
||||||
|
|
||||||
|
// to String object, ByteBuffer object, BigInteger object, List object and Map object
|
||||||
|
String ws = unpacker.read(String.class);
|
||||||
|
ByteBuffer buf = unpacker.read(ByteBuffer.class);
|
||||||
|
BigInteger bi = unpacker.read(BigInteger.class);
|
||||||
|
|
||||||
|
} catch (Exception ex) {
|
||||||
|
logger.error("MessagePack Serialization And Deserialization error", ex);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
方法 '_Packer#write()_' 允许序列化多种类型的数据。
|
||||||
|
|
||||||
|
类 '_Unpacker_' 针对反序列化二进制数据为主要变量,提供了一个反序列化方法。例如,你希望将二进制数据反序列化为 '_boolean_' (或者 '_int_') 数据类型,你可以使用 '_Unpacker_' 中的 '_readBoolean_' (或者 '_readInt_') 方法。
|
||||||
|
|
||||||
|
'_Unpacker_' 同时也为参考变量提供了一个读取的方法。这个方法允许为一个参考变量从二进制数据中进行反序列化。参考变量的定义为你将类型指定为一个参数。
|
||||||
|
例如,你希望反序列化二进制数据到 '_String_' (或者 '_byte[]_') 对象,你必须在调用 '_read(String.class)_' (或者 '_read(byte[].class)_') 方法的时候定义描述。
|
||||||
|
|
||||||
|
## List, Map 对象的序列化和反序列化(serialization/deserialization)
|
||||||
|
为了序列化原生的容器对象例如 '_List_' 和 '_Map_' 对象,你必须使用 '_Template_'。
|
||||||
|
|
||||||
|
'_Template_' 对象是 serializer 和 deserializer 的配对。例如,为了序列化一个 '_List_' 对象,在 '_List_' 对象中 '_Integer_' 对象为元素,你可以使用下面的方法来创建一个模板对象(Template object)。
|
||||||
|
|
||||||
|
```java
|
||||||
|
Template listTmpl = Templates.tList(Templates.TInteger);
|
||||||
|
```
|
||||||
|
|
||||||
|
类 '_tList_', '_TInteger_' 是静态方法,字段为 '_Templates_'。
|
||||||
|
|
||||||
|
一个 '_List 和 '_Map_' 对象的用例如下显示:
|
||||||
|
|
||||||
|
本代码可以在 https://github.com/cwiki-us-demo/messagepack-6-demo-java/blob/master/src/test/java/com/insight/demo/msgpack/MessagePack6Template.java 中查看。
|
||||||
|
|
||||||
|
```java
|
||||||
|
package com.insight.demo.msgpack;
|
||||||
|
|
||||||
|
import org.junit.Test;
|
||||||
|
import org.msgpack.MessagePack;
|
||||||
|
import org.msgpack.packer.Packer;
|
||||||
|
import org.msgpack.template.Template;
|
||||||
|
import org.msgpack.unpacker.Unpacker;
|
||||||
|
import org.slf4j.Logger;
|
||||||
|
import org.slf4j.LoggerFactory;
|
||||||
|
|
||||||
|
import java.io.ByteArrayInputStream;
|
||||||
|
import java.io.ByteArrayOutputStream;
|
||||||
|
import java.math.BigInteger;
|
||||||
|
import java.nio.ByteBuffer;
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.HashMap;
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.Map;
|
||||||
|
|
||||||
|
import static org.msgpack.template.Templates.*;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* MessagePack6Template
|
||||||
|
*
|
||||||
|
* @author yhu
|
||||||
|
*/
|
||||||
|
public class MessagePack6Template {
|
||||||
|
final Logger logger = LoggerFactory.getLogger(MessagePack6Template.class);
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Test MessagePack6Template
|
||||||
|
*/
|
||||||
|
@Test
|
||||||
|
public void testMessagePack6Template() {
|
||||||
|
logger.debug("MessagePack6Template for Template");
|
||||||
|
|
||||||
|
MessagePack msgpack = new MessagePack();
|
||||||
|
try {
|
||||||
|
|
||||||
|
// Create templates for serializing/deserializing List and Map objects
|
||||||
|
Template<List<String>> listTmpl = tList(TString);
|
||||||
|
Template<Map<String, String>> mapTmpl = tMap(TString, TString);
|
||||||
|
|
||||||
|
//
|
||||||
|
// Serialization
|
||||||
|
//
|
||||||
|
|
||||||
|
ByteArrayOutputStream out = new ByteArrayOutputStream();
|
||||||
|
Packer packer = msgpack.createPacker(out);
|
||||||
|
|
||||||
|
// Serialize List object
|
||||||
|
List<String> list = new ArrayList<String>();
|
||||||
|
list.add("msgpack");
|
||||||
|
list.add("for");
|
||||||
|
list.add("java");
|
||||||
|
packer.write(list); // List object
|
||||||
|
|
||||||
|
// Serialize Map object
|
||||||
|
Map<String, String> map = new HashMap<String, String>();
|
||||||
|
map.put("sadayuki", "furuhashi");
|
||||||
|
map.put("muga", "nishizawa");
|
||||||
|
packer.write(map); // Map object
|
||||||
|
|
||||||
|
//
|
||||||
|
// Deserialization
|
||||||
|
//
|
||||||
|
|
||||||
|
byte[] bytes = out.toByteArray();
|
||||||
|
ByteArrayInputStream in = new ByteArrayInputStream(bytes);
|
||||||
|
Unpacker unpacker = msgpack.createUnpacker(in);
|
||||||
|
|
||||||
|
// to List object
|
||||||
|
List<String> dstList = unpacker.read(listTmpl);
|
||||||
|
|
||||||
|
// to Map object
|
||||||
|
Map<String, String> dstMap = unpacker.read(mapTmpl);
|
||||||
|
|
||||||
|
} catch (Exception ex) {
|
||||||
|
logger.error("MessagePack Serialization And Deserialization error", ex);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### 不使用注解(annotations)来序列化
|
||||||
|
如果你不能添加 @Message 到你的定义对象中但是你还是希望进行序列化。你可以使用 register 方法来在类中启用序列化对象。
|
||||||
|
|
||||||
|
如下的代码所示:
|
||||||
|
|
||||||
|
```java
|
||||||
|
MessagePack msgpack = new MessagePack();
|
||||||
|
msgpack.register(MyMessage2.class);
|
||||||
|
```
|
||||||
|
|
||||||
|
例如,如果 MyMessage2 类被包含到了外部的库中了。你没有办法比较容易的编辑源代码,添加 '_@Message_' 到源代码中。
|
||||||
|
|
||||||
|
register 方法能够允许为 MyMessage2 自动创建一个 serializer 和 deserializer 对。
|
||||||
|
|
||||||
|
你可以在执行方面后序列化对象 MyMessage2。
|
||||||
|
|
||||||
|
### 可选字段
|
||||||
|
你可添加一个新的字段来保持可用性。在新字段中使用 '_@Optional_' 注解。
|
||||||
|
|
||||||
|
```java
|
||||||
|
@Message
|
||||||
|
public static class MyMessage {
|
||||||
|
public String name;
|
||||||
|
public double version;
|
||||||
|
|
||||||
|
// new field
|
||||||
|
@Optional
|
||||||
|
public int flag = 0;
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
如果你尝试反序列化老版本数据的话,可选字段将会被忽略。
|
||||||
|
|
||||||
|
### 动态类型
|
||||||
|
我们知道 Java 是一个静态类型的语言。通过输入 '_Value_' MessagePack能够实现动态的特性。
|
||||||
|
|
||||||
|
'_Value_' 有方法来检查自己的类型('_isIntegerType()_', '_isArrayType()_', 等...),同时也转换为自己的类型 ('_asStringValue()_', '_convert(Template)_')。
|
||||||
|
|
||||||
|
本代码可以在 https://github.com/cwiki-us-demo/messagepack-6-demo-java/blob/master/src/test/java/com/insight/demo/msgpack/MessagePack6DynamicTyping.java 中查看。
|
||||||
|
|
||||||
|
```java
|
||||||
|
package com.insight.demo.msgpack;
|
||||||
|
|
||||||
|
import org.junit.Test;
|
||||||
|
import org.msgpack.MessagePack;
|
||||||
|
import org.msgpack.type.Value;
|
||||||
|
import org.msgpack.unpacker.Converter;
|
||||||
|
import org.slf4j.Logger;
|
||||||
|
import org.slf4j.LoggerFactory;
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
import static org.msgpack.template.Templates.TString;
|
||||||
|
import static org.msgpack.template.Templates.tList;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* MessagePack6Objects
|
||||||
|
*
|
||||||
|
* @author yhu
|
||||||
|
*/
|
||||||
|
public class MessagePack6DynamicTyping {
|
||||||
|
final Logger logger = LoggerFactory.getLogger(MessagePack6DynamicTyping.class);
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Test MessagePack6Objects
|
||||||
|
*/
|
||||||
|
@Test
|
||||||
|
public void MessagePack6DynamicTyping() {
|
||||||
|
logger.debug("MessagePack6Objects for Objects");
|
||||||
|
|
||||||
|
// Create serialize objects.
|
||||||
|
List<String> src = new ArrayList<String>();
|
||||||
|
src.add("msgpack");
|
||||||
|
src.add("kumofs");
|
||||||
|
src.add("viver");
|
||||||
|
|
||||||
|
MessagePack msgpack = new MessagePack();
|
||||||
|
|
||||||
|
try {
|
||||||
|
|
||||||
|
// Serialize
|
||||||
|
byte[] raw = msgpack.write(src);
|
||||||
|
|
||||||
|
// Deserialize directly using a template
|
||||||
|
List<String> dst1 = msgpack.read(raw, tList(TString));
|
||||||
|
|
||||||
|
// Or, Deserialze to Value then convert type.
|
||||||
|
Value dynamic = msgpack.read(raw);
|
||||||
|
List<String> dst2 = new Converter(dynamic).read(tList(TString));
|
||||||
|
|
||||||
|
} catch (Exception ex) {
|
||||||
|
logger.error("MessagePack Serialization And Deserialization error", ex);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
```
|
Loading…
x
Reference in New Issue
Block a user