Получение сообщения с настраиваемым объектом на клиенте Android SignalR, данные не десериализуются

Я использую SignalR на веб-сервере ASP.NET Core 5 для управления устройствами Android. Я могу отправлять сообщения с устройства (D2C) и получать сообщения с Stringпараметры (C2D). Но я не могу получать сообщения с параметрами настраиваемого объекта, обработчик получает все члены объекта как null. Я разрабатываю клиент WPF, и он хорошо принимает этот объект.

I'm following ASP.NET Core SignalR Java client documentation. It explains how to use custom objects in Passing Class information in Java section.

In build.gradle file:

      dependencies {
    ...
    implementation 'com.microsoft.signalr:signalr:5.0.5'
    implementation 'org.slf4j:slf4j-jdk14:1.7.25'
}

This is my custom class in Android project:

      package com.mycompany.mayapp.signalr.models;

public class CustomClass
{
    public String Param1;
    public String Param2;
}

If this can help, this is my custom class in ASP.NET Core project (if I use fields instead of properties WPF client doesn't work, I don't know why):

      namespace MyWebWithSignalRCore.SignalR.Models
{
    public class CustomClass
    {
        public string Param1 { get; set; }
        public string Param2 { get; set; }
    }
}

And this is my android client class:

      package com.mycompany.mayapp.signalr;

import android.util.Log;
import com.fagorelectronica.fagorconnectservice.signalr.models.UpdateAppParams;
import com.microsoft.signalr.HubConnection;
import com.microsoft.signalr.HubConnectionBuilder;
import com.microsoft.signalr.OnClosedCallback;
import com.microsoft.signalr.TypeReference;    
import java.lang.reflect.Type;

public class SignalRClient
{
    private static final String TAG = SignalRClient.class.getSimpleName();
    HubConnection hubConnection;

    public SignalRClient(String url)
    {
        this.hubConnection = HubConnectionBuilder.create(url).build();
        this.handleIncomingMethods();
    }
    private void handleIncomingMethods()
    {
        this.hubConnection.on("ReceiveMessage", (user, message) -> { // OK
            Log.d(TAG, user + ": " + message);
        }, String.class, String.class);

        this.hubConnection.on("Reset", () -> { // OK
            Log.d(TAG, "Reset device");
        });

        Type customClassType = new TypeReference<CustomClass>() { }.getType();
        this.hubConnection.<CustomClass>on("Custom", (params) -> { // NOK!!
            Log.d(TAG, params.Param1 + ": " + params.Param2);
        }, customClassType);
    }

    public void start()
    {
        this.hubConnection.start().blockingAwait();
        this.hubConnection.send("Hello", "My device ID"); // OK
    }
    public void stop()
    {
        this.hubConnection.stop().blockingAwait();
    }    
}

This is the output I get in each handler:

      D/SignalRClient: User: message
D/SignalRClient: Reset device
D/SignalRClient: null: null

Do you know what I'm doing wrong?

1 ответ

Решение

Кажется, что в java-клиенте имена полей настраиваемых объектов должны быть в нижнем регистре. Таким образом, изменение имен полей решает проблему.

Пользовательский класс в проекте Android:

      package com.mycompany.mayapp.signalr.models;

public class CustomClass
{
    public String param1;
    public String param2;
}

Способ обращения:

      private void handleIncomingMethods()
{
    // ... other methods ...

    Type customClassType = new TypeReference<CustomClass>() { }.getType();
    this.hubConnection.<CustomClass>on("Custom", (params) -> { // OK!!
        Log.d(TAG, params.param1 + ": " + params.param2);
    }, customClassType);
}
Другие вопросы по тегам