代码之家  ›  专栏  ›  技术社区  ›  Abhijit Sarkar

如何以可读的方式记录嵌套对象中的Protobuf字符串?

  •  0
  • Abhijit Sarkar  · 技术社区  · 4 年前

    给定一个proto文件:

    syntax = "proto3";
    package hello;
    
    message TopGreeting {
        NestedGreeting greeting = 1;
    }
    
    message NestedGreeting {
        Greeting greeting = 1;
    }
    
    message Greeting {
        string message = 1;
    }
    

    代码是:

    public class Main {
        public static void main(String[] args) {
            System.out.printf("From top: %s%n", newGreeting("오늘은 무슨 요일입니까?"));
            System.out.printf("Directly: %s%n", "오늘은 무슨 요일입니까?");
            System.out.printf("ByteString: %s", newGreeting("오늘은 무슨 요일입니까?").toByteString().toStringUtf8());
        }
    
        private static Hello.TopGreeting newGreeting(String message) {
            Hello.Greeting greeting = Hello.Greeting.newBuilder()
                    .setMessage(message)
                    .build();
            Hello.NestedGreeting nestedGreeting = Hello.NestedGreeting.newBuilder()
                    .setGreeting(greeting)
                    .build();
            return Hello.TopGreeting.newBuilder()
                    .setGreeting(nestedGreeting)
                    .build();
        }
    }
    

    输出

    From top: greeting {
      greeting {
        message: "\354\230\244\353\212\230\354\235\200 \353\254\264\354\212\250 \354\232\224\354\235\274\354\236\205\353\213\210\352\271\214?"
      }
    }
    
    Directly: 오늘은 무슨 요일입니까?
    
    ByteString: 
    %
    #
    !오늘은 무슨 요일입니까?
    

    如何以可读的方式打印消息?如您所见,转换为 ByteString 可以打印UTF-8字符,但也可以打印一些其他垃圾 % #

    0 回复  |  直到 4 年前
        1
  •  2
  •   Abhijit Sarkar    4 年前

    回答我自己的问题,我通过挖掘Protobuf源代码解决了这个问题。

    System.out.println(TextFormat.printer().escapingNonAscii(false).printToString(greeting))
    

    输出:

    greeting {
      greeting {
        message: "오늘은 무슨 요일입니까?"
      }
    }
    

    toString 使用相同的机制,但是 escapingNonAscii(true) (省略时为默认值)。

    另请参见 this answer 如果您没有访问源代码的权限,如何将八进制序列转换为UTF-8字符,请只查看日志。

        2
  •  0
  •   Marc Gravell    4 年前

    不是吗 人类可读的,你不应该试图这样做。如果需要的话,可以使用JSON变体,但是坦率地说,最好记录解释的数据,而不是有效负载。