Я успешно скомпилировал свой файл .proto с помощью google.proto.Timestamp и сгенерировал файл .cs с помощью protoc. Единственная проблема, с которой я столкнулся, - это инициализация в моем коде на С #.

Я пробовал следующее:

Файл .proto

message teststamp
{
    string Name = 1 ;
    string address = 2;
    google.protobuf.Timestamp _timeStamp = 3;
}

Файл C #

teststamp test = new teststamp();
test.Name = "Test";
test.address = "Test_Test_TEST"
//Example 2 : POSIX
test._timeStamp.Seconds = DateTime.Now.Second;
test._timeStamp.Nanos = DateTime.Now.Second*1000 ;

Вышеупомянутое компилируется без ошибок, но дает мне эту ошибку: Object reference not set to an instance of an object. Я пробовал несколько других подходов, но из-за меньшей помощи он не может исправить ошибку.

Пожалуйста, помогите мне в этом вопросе

Благодарность

3
KhanBaba 6 Сен 2016 в 14:43

5 ответов

Лучший ответ

Timestamp - это класс, поэтому сначала нужно создать его следующим образом:

test._timeStamp = new Timestamp() { Seconds = DateTime.Now.Second }
2
Optional Option 7 Окт 2016 в 20:37

Большинство людей, вероятно, просто захотят использовать вспомогательные методы:

using Google.Protobuf.WellKnownTypes;

var timestamp = Timestamp.FromDateTime(DateTime.UtcNow)
10
StefanGordon 12 Янв 2020 в 00:52

Полный пример для всех. Дополнительная информация Официальная документация по Google.Protobuf.WellKnownTypes.Timestamp

Прото

syntax = "proto3";

option csharp_namespace = "Test";
import "google/protobuf/timestamp.proto";

package OnlineGrpc;
service OnlineGrpcService {
  rpc SendMessage(SendMessageRequest) returns (SendMessageResponse);
}
message SendMessageRequest{
    google.protobuf.Timestamp requestDate = 1;
}

message SendMessageResponse{
    google.protobuf.Timestamp responseDate = 1;
}

C # отправить запрос

var request = new SendMessageRequest();
request.requestDate = DateTime.Now.ToTimestamp();
request.requestDate = DateTimeOffset.Now.ToTimestamp();

C # ответ на чтение

var response = new SendMessageResponse();
DateTimeOffset dateOffset = response.responseDate.ToDateTimeOffset();
DateTime date = response.responseDate.ToDateTime();
5
valentasm 19 Фев 2020 в 22:58

На случай, если кто-нибудь наткнется на этот пост.

Вот пример кода:

var unixTimeMS = DateTimeOffset
    .UtcNow
    .ToUnixTimeMilliseconds();

var seconds = unixTimeMS / 1000;
var nanos = (int)((unixTimeMS % 1000) * 1e6);

var lul = new ProtoModel
{
    Timestamp = new Google.Protobuf.WellKnownTypes.Timestamp()
    {
        Seconds = seconds,
        Nanos = nanos
    }
};

var unixTimeMSBack = lul.Timestamp
                .ToDateTimeOffset()
                .ToUnixTimeMilliseconds();
2
datoml 14 Мар 2019 в 13:12

Вот моя попытка преобразовать существующий экземпляр DateTime в Timestamp:

// doc.CreateOn is a DateTime 
Timestamp.FromDateTime(DateTime.SpecifyKind(doc.CreatedOn, DateTimeKind.Utc));
0
Johnny Wu 15 Июл 2020 в 16:26