Google.Protobuff timestamp.proto 在 C# 中

Google.Protobuff timestamp.proto in c#

我已经使用 google.proto.Timestamp 成功编译了我的 .proto 文件并使用 protoc 生成了 .cs 文件。我遇到的唯一问题是在我的 C# 代码中进行初始化。

我尝试了以下方法:

.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。我尝试了其他几种方法,但由于帮助较少,无法修复错误。

请帮我解决这个问题

谢谢

时间戳是 class 所以你必须先像这样创建它:

test._timeStamp = new Timestamp() { Seconds = DateTime.Now.Second }

万一有人无意中发现这个post。

这是一个代码示例:

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();

大多数人可能只想使用辅助方法:

using Google.Protobuf.WellKnownTypes;

var timestamp = Timestamp.FromDateTime(DateTime.UtcNow)

任何人的完整示例。 更多信息 Official documentation about 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();

这是我将现有 DateTime 实例转换为时间戳的尝试:

// doc.CreateOn is a DateTime 
Timestamp.FromDateTime(DateTime.SpecifyKind(doc.CreatedOn, DateTimeKind.Utc));