Я успешно скомпилировал свой файл .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
. Я пробовал несколько других подходов, но из-за меньшей помощи он не может исправить ошибку.
Пожалуйста, помогите мне в этом вопросе
Благодарность
5 ответов
Timestamp - это класс, поэтому сначала нужно создать его следующим образом:
test._timeStamp = new Timestamp() { Seconds = DateTime.Now.Second }
Большинство людей, вероятно, просто захотят использовать вспомогательные методы:
using Google.Protobuf.WellKnownTypes;
var timestamp = Timestamp.FromDateTime(DateTime.UtcNow)
Полный пример для всех. Дополнительная информация Официальная документация по 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();
На случай, если кто-нибудь наткнется на этот пост.
Вот пример кода:
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();
Вот моя попытка преобразовать существующий экземпляр DateTime в Timestamp:
// doc.CreateOn is a DateTime
Timestamp.FromDateTime(DateTime.SpecifyKind(doc.CreatedOn, DateTimeKind.Utc));
Похожие вопросы
Новые вопросы
c#
C# (произносится как «see Sharp») — это высокоуровневый мультипарадигменный язык программирования со статической типизацией, разработанный Microsoft. Код C# обычно нацелен на семейство инструментов и сред выполнения Microsoft .NET, которое включает в себя .NET, .NET Framework, .NET MAUI и Xamarin среди прочих. Используйте этот тег для ответов на вопросы о коде, написанном на C#, или о формальной спецификации C#.