是否可以通过生成.proto文件,用python反序列化用C#中的protobuf-net序列化的对象?

时间:2019-06-28 15:45:40

标签: c# python protobuf-net

问题在于数据的生产者没有.proto定义,而只有.cs文件。

从其他问题来看,似乎有可能,但是是否有工具将.cs protobuf-net定义转换为.proto文件,以便我可以使用该文件在python中反序列化?

1 个答案:

答案 0 :(得分:0)

import { sign } from 'tjam-pdf-utils';
import { GenericErrorException } from 'tjam-node-exceptions';
import { readFile, createWriteStream, unlinkSync } from 'fs';

let Pdf = require('pdfkit');

interface paramsCertificate {
    oficial?: string;
    doc?: string;
    mandado?: string;
    processo?: string;
    descricao?: string;
    latitude?: string;
    longitute?: string;
    precisao?: string;
    classe?: string;
    indiciado?: string;
    docSigner?: string;
    currentDir?: string;
    pathCertificate?: string;
    pathCertificateSigner?: string;
    blob?: any;
    image?:any;
    error?: GenericErrorException;
}



function makeCretificate(c:paramsCertificate): Promise<paramsCertificate> {
    return new Promise((resolve, reject) => {
        try {
            c.oficial = null? '': c.oficial;
            c.mandado = null? '': c.mandado;
            c.processo = null? '': c.processo;
            c.classe = null? '': c.classe;
            c.descricao = null? '': c.descricao;
            c.latitude = null? '': c.latitude;
            c.longitute = null? '': c.longitute;
            c.precisao = null? '': c.precisao;

            let date = new Date().toLocaleString('pt-BR');

            c.pathCertificate = c.currentDir + (c.oficial.replace(/\s/gi, '')) + '_' + (date.replace(/\s/gi, '-'));

            let myDoc = new Pdf({ size: 'a4',  margin: 40,  autoFirstPage: false});

            let  options = { encoding: 'binary' };
            myDoc.pipe(createWriteStream(c.pathCertificate + '.pdf', options));

            let pageNumber = 0;
            myDoc.on('pageAdded', () => {
                pageNumber++;
                let bottom = myDoc.page.margins.bottom;
                myDoc.page.margins.bottom = 0;
                myDoc.font('Times-Roman')
                    .text(`${pageNumber}`,
                        (myDoc.page.width - 50),
                        myDoc.page.height - 50,
                );

                // Reset text writer position
                myDoc.text('', 50, 50);
                myDoc.page.margins.bottom = bottom;
            });

            // espaços entre os textos
            let enter = '\n\n';

            myDoc.addPage();
            // brasão do tribunal
            let  center = Math.round((myDoc.page.width - 70) / 2);
            myDoc.image(c.currentDir + 'TJAM.png', center, 40, {width: 70, height: 85});

            // cabeçalho do tribunal
            let header_01 = `PODER JUDICIÁRIO`;
            myDoc.y = 140
            myDoc.text(header_01, {
                align:'center'
            });

            let header_02 = `TRIBUNAL DE JUSTIÇA DO AMAZONAS`;
            myDoc.text(header_02, {
                align:'center'
            });


            // cabeçalho da certidão
            let mandado = 'Mandado: ' + formatarNumMandado(c.mandado);
            let processo = 'Processo nº: ' + formatarNumProcesso(c.processo);
            let classe = 'Classe: ' + c.classe;
            // let indiciado = 'Indiciado(s): ' + c.indiciado;
            myDoc.text(enter
                + mandado
                + '\n'+ processo
                + '\n' + classe
                , {align: 'justify'});



            // texto
            let certidão = 'CERTIDÃO';
            myDoc.text(enter
                + certidão, {align: 'center'});

            let text = c.descricao + '. Mandado cumprido na posição geográfica <' 
                + c.latitude + ', ' + c.longitute + '> (precisaõ de ' + c.precisao + ' metro(s))';
            myDoc.font('Times-Italic')
                .lineGap(5)
                .text(enter
                    + text, {align: 'justify'});
myDoc.end();
            resolve(c);
        }
        catch (err) {
            c.error = new GenericErrorException(`Ocorreu um erro ao montar a certidão: ${err.toString()}`);
            reject(c);
        }
    });
}

请注意,如果您使用的是string proto = Serializer.GetProto<YourRootType>(); DateTime,则最好使用TimeSpan-分别使用DataFormat.WellKnownTimestamp-但是,是对您现有数据的重大更改(通过Duration完成)